大家都知道ios在swift2.0中支持" performSelector“我想知道怎样才能得到performSelector的返回值?
let returnValue:Unmanaged<AnyObject> = (self.dataSource?.performSelector("myselector:", withObject: self))!
let value : Int? = returnValue.takeRetainedValue() as? Int在最后一行出现崩溃,如何在swift2.0中从"performSelector“中获取值?
发布于 2015-11-02 19:47:04
我认为目前Swift中的performSelector只支持符合AnyObject的返回值,在你的例子中,你有Int,它不支持。在这种情况下,performSelector将返回nil,并且您的代码将显式地展开可选的,从而导致程序崩溃。
因此,解决此问题的一种方法是创建一个返回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()发布于 2019-05-12 18:49:13
使用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针对Swift 5进行了更新:
同样适用于NSSelectorFromString:假设您有一个名为aViewController的UIViewController。
let value = aViewController.perform(NSSelectorFromString("view")) //type of value is Unmanaged<AnyObject?>
let uvalue = value.takeUnretainedValue() //type of uvalue is now AnyObject?
let myView = value as? UIView //type of result is now UIView发布于 2017-11-28 07:22:55
您可以通过以下方式获取performSelector的NSInteger结果
let returnValue = dataSource?.perform(#selector(myselector:), withObject: self)!
let value = Int(bitPattern: returnValue.toOpaque())https://stackoverflow.com/questions/33476214
复制相似问题