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

Yic*_*man 12 pointers casting objective-c unsafe-pointers swift

我对Objective C不熟悉

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

该属性在Objective C中以这种方式声明:

@property (nonatomic, assign) BOOL *isSSNField;
Run Code Online (Sandbox Code Playgroud)

在swift中我试图以这种方式改变属性的值:

myClass.isSSNField = true
Run Code Online (Sandbox Code Playgroud)

我收到了这个错误

Cannot assign a value of type 'Bool' to a value of type 'UnsafeMutablePointer<ObjcBool>'
Run Code Online (Sandbox Code Playgroud)

我不知道从哪里开始,或者为什么我得到这个错误

mat*_*att 19

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

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

然而,虽然我认为这会编译,但我不清楚这样做的含义是什么.它可能导致宇宙坍缩成黑洞,所以要小心.

  • 是的,你现在给我一个复选标记,但当宇宙坍塌到一个黑洞时,你会回来的. (12认同)
  • @theguy 那是一个 `Bool*` _function parameter_。这些实际上很常见,尤其是在块中(如这里)。但这不是我说的,是吗?我说的是`Bool*` _property_。 (2认同)
  • @matt Bool 指针适用于 Objective-C 和现代 Swift 中的任何字符串枚举例程。例如 [[NSString enumerateSubstringsInRange:options:usingBlock:](https://developer.apple.com/reference/foundation/nsstring/1416774-enumeratesubstringsinrange?language=objc)]。 (2认同)

acc*_*ews 15

Swift 3.1的更新

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

v3.1的文档说它用于访问此指针引用的实例

您可以轻松设置指针字段

myClass.isSSNField.pointee = false
Run Code Online (Sandbox Code Playgroud)

对于所有指针类型和转换,这都是相同的.如果要检查Objective C的值,BOOL*您可以轻松完成

if myClass.isSSNField.pointee.boolValue
Run Code Online (Sandbox Code Playgroud)

  • 在Swift 3中,`.memory`现在是`.pointee`,用于我迄今为止见过的案例. (3认同)

Fro*_*tix 6

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

var isSSNField = ObjCBool(true)
myClass.isSSNField = &isSSNField
Run Code Online (Sandbox Code Playgroud)


小智 5

Objective-C中的BOOL *是Bool的指针。
在Swift中使用UnsafeMutablePointer。

var isSSNField: ObjCBool = true
myClass.isSSNField = &isSSNField
Run Code Online (Sandbox Code Playgroud)

然后修复它。

就像在功能上isDirectory参数:

func fileExists(atPath path: String, isDirectory:UnsafeMutablePointer<ObjCBool>?) -> Bool
Run Code Online (Sandbox Code Playgroud)

您可以使用以下代码:

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