【问题标题】:Why is a ObjC 'NSString * _Nullable' is transformed to a 'String!' property in Swift为什么将 ObjC 'NSString * _Nullable' 转换为 'String!'斯威夫特的财产
【发布时间】:2016-02-10 08:16:21
【问题描述】:

在我的 Objective C 代码中,我有以下属性: @property (nonatomic, readonly) NSString * _Nullable myNullableString;

我想在我的 Swift 代码中使用它,但在这种情况下,Xcode / Sourcekit 认为 myNullableString 不是 String? 类型,而是 String! 类型。

由于这个事实,保护展开属性是不正确的,但强制使用也是不正确的,如果我想构建它,将导致 Xcode / SourceKit 崩溃或段错误。

知道怎么解决吗?

【问题讨论】:

  • 无法复制,_Nullable 按我的预期工作。你能提供一个最小的独立示例吗?
  • Command-Shift K,然后再次构建可能会有所帮助。
  • 您好,感谢您的尝试。现在不行。来源来自内部框架。你得到一个字符串吗?如果你使用 _Nullable 属性?
  • @gnasher729 我清理了项目、构建文件夹和偏差数据文件夹。但我还是有这种怪癖。
  • @property (nonatomic, readonly) NSString * _Nullable myNullableString; 被导入为public var myNullableString: String? { get }。 – 在一个带有小样本类的新项目中尝试。然后看看你的实际项目是否有差异。

标签: objective-c xcode swift bridging-header


【解决方案1】:

Nullnil 不同。 Null 的字符串是一个未初始化的字符串,但是在 swift 中你有一个在 obj-c 中不存在的称为“可选”的字符串。

所以String? 表示该函数将返回一个完整的字符串或nil,这是未定义的(未初始化)。

所以事实上 swift 中最接近的东西是 String!" 这是一个 强制字符串(不能返回 nil)。

编辑:正如马丁在 cmets 中指出的那样——上述陈述的第一部分是不正确的

【讨论】:

  • 只是为了我的理解,为什么这篇文章被否决了?
  • 我也想知道
  • 我没有投票,但是_Nullable注解的目的正是NSString *映射到Swift为String?,比较developer.apple.com/swift/blog/?id=25
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-02
  • 2016-09-19
  • 1970-01-01
  • 1970-01-01
  • 2015-08-03
  • 1970-01-01
相关资源
最近更新 更多