无法在 Swift 中分配 UnsafeMutablePointer ObjCBool​​ 类型的值

Cannot assign value of type UnsafeMutablePointer ObjCBool in Swift

我不熟悉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>'

我不确定从这里到哪里去,或者我为什么会收到这个错误

我从来没有见过你描述的情况,我个人很想说这种情况不存在;我一生中从未见过 BOOL* 属性 或 Objective-C 中的 ivar(相信我,我该死的老了)。但是,如果你坚持:我没有测试过这个,但我想你可以这样说:

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

然而,虽然我认为这将 编译,但我不太清楚的含义。它可能导致宇宙坍缩成黑洞,所以要小心。

更新 Swift 5.1

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

Documentation for v5.1 表示它用于访问此指针引用的实例

您可以轻松设置指针字段

myClass.isSSNField.pointee = false

这对所有指针类型和转换都是一样的。如果你想检查 Objective C BOOL* 的值,你可以轻松地

if myClass.isSSNField.pointee.boolValue

Objective-C中的BOOL*是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)

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

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

您的 Objective C 属性 声明似乎不正确。请按以下方式更新并尝试

@property (nonatomic, assign)BOOL isSSNField;