Still trying on this (copied the code directly, Foo is actually XCTestCase):

typealias TestMethod = @convention(c) (XCTestCase) throws -> Void

This seagulls the compiler with “error: '(XCTestCase) throws -> Void' is not 
representable in Objective-C, so it cannot be used with '@convention(c)’”. I’m 
trying to use it here:

let testMethod: IMP = method_getImplementation(method)

let test: TestMethod = unsafeBitCast(testMethod,
                                     to: TestMethod.self)

testMethods.append((methodName as String, test))

If I try to put the type directly in the call to unsafeBitCast(), the compiler 
gives me an error:

Attribute can only be applied to types, not declarations

Thanks for your suggestions! I hadn’t seen @convention() before.


Jeff Kelley

slauncha...@gmail.com | @SlaunchaMan <https://twitter.com/SlaunchaMan> | 
jeffkelley.org <http://jeffkelley.org/>
> On Nov 21, 2016, at 12:08 AM, Jacob Bandes-Storch <jtban...@gmail.com> wrote:
> 
> For a function such as bar() above, the type you want to cast the IMP to 
> would probably be "@convention(c) (Foo, Selector) -> ()".
> 
> On Sun, Nov 20, 2016 at 9:05 PM, Jeff Kelley <slauncha...@gmail.com 
> <mailto:slauncha...@gmail.com>> wrote:
> Thanks Jacob! I tried using unsafeBitCast, but it fails with the following: 
> “fatal error: can't unsafeBitCast between types of different sizes”. I 
> considered wrapping every call in a closure that calls objc_msgSend(), but 
> alas, that’s not exposed to Swift. I have another approach in mind, so I’ll 
> try that next.
> 
> 
> Jeff Kelley
> 
> slauncha...@gmail.com <mailto:slauncha...@gmail.com> | @SlaunchaMan 
> <https://twitter.com/SlaunchaMan> | jeffkelley.org <http://jeffkelley.org/>
>> On Nov 19, 2016, at 1:58 AM, Jacob Bandes-Storch <jtban...@gmail.com 
>> <mailto:jtban...@gmail.com>> wrote:
>> 
>> I imagine unsafeBitCast would be the way to go here. But are you assuming 
>> that all of the instance methods have type "(Foo) throws -> Void" ? Or do 
>> you somehow want to dynamically use the type information?
>> 
>> Jacob
>> 
>> On Fri, Nov 18, 2016 at 10:37 PM, Jeff Kelley via swift-users 
>> <swift-users@swift.org <mailto:swift-users@swift.org>> wrote:
>> Hello,
>> 
>>      I’m trying to enumerate the methods of a class in Swift using the 
>> Objective-C runtime. Everything is working fine so far, except for the very 
>> last step. Suppose I have a Swift class like this:
>> 
>> class Foo: SomeSuperclass {
>>     
>>     @objc func bar() {
>>         print("Hello, World!")
>>     }
>>     
>> }
>> 
>>      Using the Objective-C runtime methods, I can get the method with 
>> class_copyMethodList and then get to the method’s implementation using 
>> method_getImplementation. However, what I need to do next is to stick this 
>> into a tuple that looks like this:
>> 
>> typealias FooEntry = (fooClass: SomeSuperclass.Type, methods: [(String, 
>> (Foo) throws -> Void)])
>> 
>>      For now, the workaround is to make a static variable that returns all 
>> of the entries:
>> 
>>     static var allEntries = {
>>         return [
>>             ("bar", bar),
>>         ]
>>     }
>> 
>>      Is there any way to go from the raw IMP that I get back from the 
>> runtime to the Swift type so I can construct this list dynamically?
>> 
>> 
>> Jeff Kelley
>> 
>> slauncha...@gmail.com <mailto:slauncha...@gmail.com> | @SlaunchaMan 
>> <https://twitter.com/SlaunchaMan> | jeffkelley.org <http://jeffkelley.org/>
>> 
>> _______________________________________________
>> swift-users mailing list
>> swift-users@swift.org <mailto:swift-users@swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-users 
>> <https://lists.swift.org/mailman/listinfo/swift-users>
>> 
>> 
> 
> 

_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to