Skip to content

Commit 61ac4f1

Browse files
committed
Allow any receiver in ClassBuilder::add_method
1 parent 6804487 commit 61ac4f1

File tree

3 files changed

+11
-10
lines changed

3 files changed

+11
-10
lines changed

objc2-foundation/examples/custom_class.rs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,20 +43,18 @@ impl MYObject {
4343
decl.add_ivar::<u32>("_number");
4444

4545
// Add ObjC methods for getting and setting the number
46-
extern "C" fn my_object_set_number(this: &mut Object, _cmd: Sel, number: u32) {
47-
unsafe {
48-
this.set_ivar("_number", number);
49-
}
46+
extern "C" fn my_object_set_number(this: &mut MYObject, _cmd: Sel, number: u32) {
47+
this.set_number(number);
5048
}
5149

52-
extern "C" fn my_object_get_number(this: &Object, _cmd: Sel) -> u32 {
53-
unsafe { *this.ivar("_number") }
50+
extern "C" fn my_object_get_number(this: &MYObject, _cmd: Sel) -> u32 {
51+
this.number()
5452
}
5553

5654
unsafe {
57-
let set_number: extern "C" fn(&mut Object, Sel, u32) = my_object_set_number;
55+
let set_number: extern "C" fn(&mut MYObject, Sel, u32) = my_object_set_number;
5856
decl.add_method(sel!(setNumber:), set_number);
59-
let get_number: extern "C" fn(&Object, Sel) -> u32 = my_object_get_number;
57+
let get_number: extern "C" fn(&MYObject, Sel) -> u32 = my_object_get_number;
6058
decl.add_method(sel!(number), get_number);
6159
}
6260

objc2/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
3434
let obj: *mut Object = unsafe { msg_send![class!(NSObject), new] };
3535
let obj = unsafe { Id::new(obj) }.expect("Failed to allocate object.");
3636
```
37+
* Allow specifying any receiver `T: Message` for methods added with
38+
`ClassBuilder::add_method`.
3739

3840
### Fixed
3941
* Properly sealed the `MessageArguments` trait (it already had a hidden

objc2/src/declare.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,9 +195,10 @@ impl ClassDecl {
195195
///
196196
/// The caller must ensure that the types match those that are expected
197197
/// when the method is invoked from Objective-C.
198-
pub unsafe fn add_method<F>(&mut self, sel: Sel, func: F)
198+
pub unsafe fn add_method<T, F>(&mut self, sel: Sel, func: F)
199199
where
200-
F: MethodImplementation<Callee = Object>,
200+
T: Message + ?Sized, // TODO: Disallow `Class`
201+
F: MethodImplementation<Callee = T>,
201202
{
202203
let encs = F::Args::ENCODINGS;
203204
let sel_args = count_args(sel);

0 commit comments

Comments
 (0)