【问题标题】:Cannot assign value of type UnsafeMutablePointer ObjCBool in Swift无法在 Swift 中分配 UnsafeMutablePointer ObjCBool​​ 类型的值
【发布时间】:2015-07-31 17:13:09
【问题描述】:

我不熟悉 Objective C。

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

Objective C 中的属性是这样声明的:

@property (nonatomic, assign) BOOL *isSSNField;

我正在尝试以这种方式更改属性的值:

myClass.isSSNField = true

我收到了这个错误

Cannot assign a value of type 'Bool' to a value of type 'UnsafeMutablePointer<ObjcBool>'

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

【问题讨论】:

  • 您确定该属性应该是指向 BOOL 的 指针 吗?
  • BOOL *isSSNField 你确定吗?这是在 Objective-C 中声明属性的一种非常不寻常的方式。 BOOL* 是一种非常稀有的鸟。我认为公平地说,虽然我在实践中遇到 BOOL*(尤其是在某些枚举方法中),但我从未见过或使用过BOOL* 属性在我的生活中。
  • 是的,这绝对是财产
  • BOOL* 看起来确实像一个错误,应该只是 BOOL
  • 更多信息会有所帮助。你想给指针本身赋值,还是给它指向的布尔值赋值?在第一种情况下,是否应该分配指针?谁负责释放内存?

标签: objective-c swift pointers casting unsafe-pointers


【解决方案1】:

Swift 5.1 更新

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

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

您可以轻松设置指针字段

myClass.isSSNField.pointee = false

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

if myClass.isSSNField.pointee.boolValue

【讨论】:

  • 在 Swift 3 中,.memory 现在是 .pointee,就我目前看到的情况而言。
  • FWIW,NSAttributedStringenumerateAttribute,它返回其中一个以在循环中像 break 一样使用。令人困惑。
【解决方案2】:

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

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

然而,虽然我认为这会编译,但我不太清楚会带来什么影响。它可能导致宇宙坍缩成黑洞,所以要小心。

【讨论】:

  • 是的,你现在给我打勾,但是当宇宙坍缩成黑洞时,你会回来的。
  • 我想我在宇宙崩溃之前找到了更好的东西:)
  • SBJson 使用它 typedef void (^SBJson4ValueBlock)(id item, BOOL* stop);在 Swift 中它被转换为: public typealias SBJson4ValueBlock = (AnyObject!, UnsafeMutablePointer) -> Void
  • @theguy 那是一个Bool* 函数参数。这些实际上很常见,尤其是在块中(如此处)。但这不是我说的,不是吗?我说的是Bool*property
  • @matt Bool 指针适用于任何字符串枚举例程,包括 Objective-C 和现代 Swift。例如[NSString enumerateSubstringsInRange:options:usingBlock:]。
【解决方案3】:

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)

【讨论】:

  • 这帮助我解决了我的 fileExists 问题,谢谢
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

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

    @property (nonatomic, assign)BOOL isSSNField;
    

    【讨论】:

      猜你喜欢
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多