首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >转换Unmanaged<AnyObject>!在斯威夫特

转换Unmanaged<AnyObject>!在斯威夫特
EN

Stack Overflow用户
提问于 2015-10-08 13:56:03
回答 5查看 2.4K关注 0票数 7

我试图得到一个现有目标C类的方法的结果,称为使用performSelector

代码语言:javascript
复制
let result = controlDelegate.performSelector("methodThatReturnsBOOL") as? Bool

我需要把这个结果投给Bool类型的Swift。

上面提到的代码给出了一个警告

“从‘非托管的!’到不相关的类型'Bool‘总是失败”

结果总是"false",即使方法返回YES。

对于将结果转换为Bool,有什么建议吗?

methodThatReturnsBOOL签名

代码语言:javascript
复制
- (BOOL)methodThatReturnsBOOL
{
    return YES;
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-01-28 22:46:53

这是很长一段时间以来,这一直没有答案,所以我补充说,我已经学到了。

要转换目标C方法返回的BOOL值,只需使用

代码语言:javascript
复制
if let result = controlDelegate.performSelector("methodThatReturnsBOOL") {
    print("true")
} else {
    print("false")
}

在这里,您还可以将值true/false赋值给Swift Bool (如果需要)。

Note:我尝试使用takeRetainedValue()Unmanaged<AnyObject>直接转换到Bool,这是许多关于它的答案所建议的,但在这个场景中似乎不起作用。

票数 10
EN

Stack Overflow用户

发布于 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?,它可以被转换成一个IntBool,一点也不麻烦。通过使用内置强制转换而不是猜测0x0或0x1的含义,我们避免了解释零指针的整个问题。

示例:

代码语言:javascript
复制
@objc func doThing() -> Bool{
    return true
}

..。

代码语言:javascript
复制
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)>
票数 2
EN

Stack Overflow用户

发布于 2017-01-10 17:21:51

这是Swift 3中的解决方案,因为方法有点不同。该方法还检查object对象是否响应选择器,以避免崩溃.

代码语言:javascript
复制
import ObjectiveC

let selector = NSSelectorFromString("methodThatReturnsBOOL")

guard controlDelegate.responds(to: selector) else {
    return
}

if let result = controlDelegate.perform(selector) {
    print("true")
}
else {
    print("false")
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33017888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档