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)
然而,虽然我认为这会编译,但我不清楚这样做的含义是什么.它可能导致宇宙坍缩成黑洞,所以要小心.
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)
更安全的处理方法与@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)
归档时间: |
|
查看次数: |
11729 次 |
最近记录: |