Tag: 反思

如何检查一个对象是否有存储的属性?

我需要检查一个对象的类是否有可用于赋值的成员。 假设有一个类: class MyClass: NSObject { var myVar : AnyObject! // … } 我试过这个objC风格,但属性是Swift中的另一个野兽,第二行始终返回false: let myClass: MyClass = MyClass() let hasClassMember = myClass.respondsToSelector(Selector("setMyVar:")) if hasClassMember { myClass.performSelector("setMyVar:", withObject: "Context" as! AnyObject) } 我认为Swift没有像ObjC那样强大的reflection,但是有什么解决方法吗? 更新事实certificate,我的代码工作,但我已经简化了演示的目的。 奇怪的部分是,当我将myVar的types更改为某个自定义类的实例时,respondsToSelector停止工作,比方说ClassB。 感觉有点神奇… 🙂 UPDATE2最后我发现了这个问题。 我没有写完整的代码,认为这个问题是在其他地方,无论如何,这里是完整的代码。 MyClassvariables实际上是另一种实现AnotherClassProtocol的AnotherClasstypes protocol AnotherClassProtocol { //… } class AnotherClass: AnotherClassProtocol { //… } class MyClass: NSObject { […]

使用reflection/自省调用具有未知数量参数的select器

最近我写了一个应用程序在Java(对于Android),它使用reflection来调用一些对象的方法。 参数号和types是未知的,这意味着,我有一个统一的机制,收到一个对象名称,方法名称和参数数组(使用JSON),并在指定的对象上调用指定的方法与参数(Object []充满了所需types的参数)。 现在我需要实现相同的iOS,我可以调用一个select器,当我知道select器预期的参数数量是这样的: SEL selector = NSSelectorFromString(@"FooWithOneArg"); [view performSelectorInBackground:selector withObject:someArg]; 我知道我可以通过使用select器接收的参数数量 int numberOfArguments = method_getNumberOfArguments(selector); 但有没有办法做一个这样的通用调用: [someObject performSelector:selector withObject:arrayOfObjects] 这几乎等同于Java的 someMethod.invoke(someObject, argumentsArray[]); ? 我想根据select器得到的参数数量来避免一个开关情况。 对不起,很长一段时间,我只是想尽可能清楚我的问题。

如何在Swift中列出符合协议的所有类?

如何列出在Swift中实现给定协议的所有类? 假设我们有一个例子: protocol Animal { func speak() } class Cat:Animal { func speak() { print("meow") } } class Dog: Animal { func speak() { print("Av Av!") } } class Horse: Animal { func speak() { print("Hurrrr") } } 这是我目前的(不可编译的)方法: func getClassesImplementingProtocol(p: Protocol) -> [AnyClass] { let classes = objc_getClassList() var ret = [AnyClass]() for cls […]