我试图得到一个现有目标C类的方法的结果,称为使用performSelector
let result = controlDelegate.performSelector("methodThatReturnsBOOL") as? Bool我需要把这个结果投给Bool类型的Swift。
上面提到的代码给出了一个警告
“从‘非托管的!’到不相关的类型'Bool‘总是失败”
结果总是"false",即使方法返回YES。
对于将结果转换为Bool,有什么建议吗?
methodThatReturnsBOOL签名
- (BOOL)methodThatReturnsBOOL
{
return YES;
}发布于 2016-01-28 22:46:53
这是很长一段时间以来,这一直没有答案,所以我补充说,我已经学到了。
要转换目标C方法返回的BOOL值,只需使用
if let result = controlDelegate.performSelector("methodThatReturnsBOOL") {
print("true")
} else {
print("false")
}在这里,您还可以将值true/false赋值给Swift Bool (如果需要)。
Note:我尝试使用takeRetainedValue()将Unmanaged<AnyObject>直接转换到Bool,这是许多关于它的答案所建议的,但在这个场景中似乎不起作用。
发布于 2019-06-08 01:22:49
在斯威夫特,你不能做你想做的事。对于接受的解决方案,我的问题是,它利用了0x0恰好是nil的思想。这实际上并不是由Swift和Objective规范保证的。布尔值也是如此,因为0x0为false,0x1为true只是一个任意的实现决定。除了在技术上是错误的,它也是可怕的代码来理解。没有考虑到在大多数平台(32/64位零)上什么是零指针,建议的是零。
在与WWDC '19的一位工程师交谈了一段时间之后,他建议您实际上可以使用valueFor(forKey:),其关键是函数名称/选择器描述。这是可行的,因为Obj运行时实际上将执行任何具有给定名称/键的函数,以便计算表达式。这仍然有点麻烦,因为它需要了解目标-C运行时,但是它保证是独立于平台和实现的,因为valueFor(forKey:)返回一个Any?,它可以被转换成一个Int或Bool,一点也不麻烦。通过使用内置强制转换而不是猜测0x0或0x1的含义,我们避免了解释零指针的整个问题。
示例:
@objc func doThing() -> Bool{
return true
}..。
let target = someObjectWithDoThing
let selectorCallResult = target.value(forKey: "doThing")
let intResult = selectorCallResult as? Int //Optional<Int(1)>
let boolResult = selectorCallResult as? Bool //Optional<Bool(true)>发布于 2017-01-10 17:21:51
这是Swift 3中的解决方案,因为方法有点不同。该方法还检查object对象是否响应选择器,以避免崩溃.
import ObjectiveC
let selector = NSSelectorFromString("methodThatReturnsBOOL")
guard controlDelegate.responds(to: selector) else {
return
}
if let result = controlDelegate.perform(selector) {
print("true")
}
else {
print("false")
}https://stackoverflow.com/questions/33017888
复制相似问题