无法将UnsafeMutablePointer ObjCBool类型的值分配给Swift

19

我不熟悉Objective C。

我正在使用一个私有框架,需要能够从我的Swift代码中更改其中一个属性。

这个属性是用Objective C这种方式声明的:

@property (nonatomic, assign) BOOL *isSSNField;

我正在 Swift 中尝试以这种方式更改属性的值:

myClass.isSSNField = true

我遇到了这个错误

Cannot assign a value of type 'Bool' to a value of type 'UnsafeMutablePointer<ObjcBool>'

我不确定该从哪里继续,也不知道为什么会出现这个错误


4
你确定这个属性应该是一个指向BOOL的指针吗? - Martin R
6
你确定吗?在Objective-C中这是一个非常不寻常的声明属性的方式。BOOL*是一种非常罕见的类型。我认为可以说,尽管我在实践中遇到过BOOL*(特别是在某些枚举方法中),但我从未在我的生活中看到或使用过BOOL*作为属性。 - matt
是的,那绝对是该属性。 - YichenBman
BOOL* 看起来确实像一个错误,应该改为 BOOL - fluidsonic
1
更多信息会很有帮助。您想将值分配给指针本身还是指向的布尔值?在第一种情况下,指针是否应该被分配?谁负责释放内存? - Martin R
显示剩余2条评论
5个回答

22

Swift 5.1更新

对于指针类型,Swift提供了pointee属性。

v5.1文档中说明它用于访问由该指针引用的实例。

您可以轻松设置pointee字段。

myClass.isSSNField.pointee = false

这适用于所有指针类型和转换。如果您想检查Objective C BOOL *的值,您可以轻松地

if myClass.isSSNField.pointee.boolValue

4
在Swift 3中,就我目前所见的情况来看,.memory现在变成了.pointee - alex bird
1
FWIW,NSAttributedStringenumerateAttribute,返回其中一个用于像循环中的break一样使用。令人困惑。 - Jonny

21

我从未见过像你描述的情况,个人倾向于说这种情况不存在; 在我的生命中从未见过Objective-C中的BOOL*属性或ivar(相信我,我已经很老了)。不过,如果你坚持:我没有测试过这个,但我认为你可以这样说:

var ok = UnsafeMutablePointer<ObjCBool>.alloc(1)
ok[0] = false // or true
let val = ok
myClass.isSSNField = val

然而,虽然我认为这样会编译,但我对这样做的影响仍然不太清楚。 它可能会导致宇宙坍塌成黑洞,所以请小心。


15
没错,现在你给了我打勾标记,但当宇宙坍缩成黑洞时,你会回来的。 - matt
我想在宇宙崩溃之前找到了更好的东西 :) - accfews
SBJson 使用以下定义: typedef void (^SBJson4ValueBlock)(id item, BOOL* stop); 在 Swift 中,它被转换为: public typealias SBJson4ValueBlock = (AnyObject!, UnsafeMutablePointer<ObjCBool>) -> Void - theguy
2
@theguy 那是一个 Bool* _函数参数_。这在块中非常常见(就像这里一样)。但那不是我说的,对吧?我说的是一个 Bool* _属性_。 - matt
2
@matt,Bool指针用于Objective-C和现代Swift中的任何字符串枚举例程。例如[NSString enumerateSubstringsInRange:options:usingBlock:]。 - Bruno Philipe
@BrunoPhilipe 请看我的上一条评论。Bool*通常用作函数参数,但不用作属性。天哪,你让我重复说了同样的话。我讨厌这种感觉。 - matt

18

在Objective-C中,BOOL*是指向布尔值的指针。
在Swift中,请使用UnsafeMutablePointer。

var isSSNField: ObjCBool = true
myClass.isSSNField = &isSSNField

那就修复它。

就像在函数中的isDirectory参数一样:

func fileExists(atPath path: String, isDirectory:UnsafeMutablePointer<ObjCBool>?) -> Bool

您可以使用以下代码:

var isDirectory:ObjCBool = true
var isFileExists = FileManager.default.fileExists(atPath: <#YourPath#>, isDirectory: &isDirectory)

这确切地帮助我解决了关于fileExists的问题,谢谢。 - gurehbgui

7

更安全的处理方式与@TanJunHao的回答非常相似:

var isSSNField = ObjCBool(true)
myClass.isSSNField = &isSSNField

0

看起来你的Objective C属性声明不正确。请按照以下方式更新并尝试

@property (nonatomic, assign)BOOL isSSNField;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接