无法在 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;
我不熟悉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.
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;