关于performSelector返回值

时间:2015-11-02 11:09:13

标签: swift unmanaged performselector

每个人都知道ios支持" performSelector"在swift2.0中 我想知道如何获取performSelector的返回值?

let returnValue:Unmanaged<AnyObject> = (self.dataSource?.performSelector("myselector:", withObject: self))!
let value : Int? = returnValue.takeRetainedValue() as? Int

最后一行出现崩溃,如何从&#34; performSelector&#34;中获取值?在swift2.0中?

2 个答案:

答案 0 :(得分:6)

我认为目前Swift中的performSelector仅支持符合AnyObject的返回值,在你的情况下你有Int而不是。在这种情况下,performSelector将返回nil,并且您的代码显式展开Optional使程序崩溃。

因此,解决此问题的一种方法是创建一个返回NSNumber的方法。

您可以在游乐场尝试此代码:

@objc class B: NSObject {
  func myselector(arg: A) -> NSNumber {
    return 0
  }
}

@objc class A: NSObject {
  var dataSource: B? = B()
  func a() -> Int {
    let returnValue = self.dataSource?.performSelector("myselector:", withObject: self)
    let value = returnValue?.takeRetainedValue() as! NSNumber
    return value.integerValue
  }
}

A().a()

答案 1 :(得分:0)

使用takeUnretainedValue

let foo = Foo()
let value = foo.performSelector(Selector("bar")) //type of value is Unmanaged<AnyObject?>
let uvalue = value.takeUnretainedValue() //type of uvalue is now AnyObject?
let result = value as? String //type of result is now String

还可以与NSSelectorFromString一起使用:假设您有一个名为UIViewController的{​​{1}}。快速的5种语法。

aViewController