18

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

5 回答 5

21

Swift 5.1 更新

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

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

您可以轻松设置pointee字段

myClass.isSSNField.pointee = false

这对于所有指针类型和转换都是相同的。如果您想检查目标 C 的值,BOOL*您可以轻松

if myClass.isSSNField.pointee.boolValue
于 2015-12-07T14:47:13.057 回答
20

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

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

但是,尽管我认为这会编译,但我不太清楚这样做会产生什么影响。它可能导致宇宙坍缩成黑洞,所以要小心。

于 2015-05-19T18:18:26.070 回答
13

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)
于 2017-03-07T03:12:24.390 回答
6

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

var isSSNField = ObjCBool(true)
myClass.isSSNField = &isSSNField
于 2017-07-05T20:56:31.327 回答
0

看起来您的 Objective C 属性声明不正确。请像下面这样更新并尝试

@property (nonatomic, assign)BOOL isSSNField;
于 2019-03-08T05:17:54.180 回答