哪些 Swift 类型可以在 Objective-C 中表示?

Posted

技术标签:

【中文标题】哪些 Swift 类型可以在 Objective-C 中表示?【英文标题】:Which Swift types can be represented in Objective-C? 【发布时间】:2014-06-30 10:59:50 【问题描述】:

我正在 Swift 中创建一个 NSManagedObject 子类,当我创建一个 Int、Float 或 Double 类型的 Optional 属性时出现错误(可能还有其他我没有尝试过的属性)。

@NSManaged var number: Float? //error:Property cannot be marked @NSManaged because its type cannot be represented in Objective-C
@NSManaged var anotherNumber: Float //no error
@NSManaged var array: NSArray? //no error
@NSManaged var anotherArray: Array<String>? //no error

Objective-C 可以表示哪些可选类型?为什么当我使用 Swift Array 或 String 时(以及当我不使用 Optional Int 或 Double 时)没有出现错误?

【问题讨论】:

【参考方案1】:

您不能将任意类型分配给 Core Data 属性,因为访问器方法是在运行时动态创建的。如果你创建一个 Objective-C Xcode 中的托管对象子类,然后您将看到使用的正确数据类型 通过核心数据,例如

NSNumber 用于布尔、整数、浮点和双精度属性, NSString 用于字符串属性, NSSet 用于(无序)对多关系。

你必须在 Swift 中选择相同的数据类型。

理论上,原始数据类型的标量访问器也应该工作, 但是当前的 Swift 版本好像有问题,比较一下 How to use Core Data Integer 64 with Swift Int64? 或 EXC_BAD_ACCESS error when trying to change Bool property。

【讨论】:

感谢您的回答。你的意思是可以使用原始数据类型,但在当前的 Swift 版本中不起作用?还有,为什么只有类型是可选的时候才会出现错误? @NSHeffalump:1)是的。如果您在 Objective-C 中创建 MO 子类并在 Swift 中使用它们,原始数据类型就可以工作。仅当您在 Swift 中创建 MO 子类时,您才会在某个时候遇到运行时异常。 - 2) Float? 没有对应的 (Objective-)C 类型。 Float 在 Objective-C 中转换为 floatNSArray?Array&lt;String&gt;? 都转换为 NSArray *。但是定义@NSManaged var number: Float?没有意义,即使Float? 在Objective-C 中是可表示的。 CoreData 在运行时创建访问器,因此您必须声明 CD 选择的类型。 (续)如果您将属性声明为@NSManaged var array: NSArray?,那么当您尝试分配值时,它很可能会在运行时崩溃。 感谢您的澄清。我刚刚测试了一个具有 MO 子类@NSManaged var array: NSArray? 中的属性的应用程序。当 xcdatamodeld 中的属性未设置为 Optional 时,它会崩溃,否则不会。这是否意味着只有原始数据类型作为可选项不能在 Objective-C 中表示? 如果你想让一个 NSManaged 属性是可选的,你需要使用 NSNumber 来代替 boolean、integer、float 和 double。使用 NSManaged 时,标量类型似乎不是可选的。

以上是关于哪些 Swift 类型可以在 Objective-C 中表示?的主要内容,如果未能解决你的问题,请参考以下文章

在 swift 数据模型中使用来自 Objective-C++ 框架的数据类型

在 swift 数据模型中使用来自 Objective-C++ 框架的数据类型

Objective-C 库的 Swift “使用未声明的类型”

Objective-C 库的 Swift “使用未声明的类型”

在 Swift 中为 Objective C 函数提供 NSMutableArray 类型

如何使用 Swift 从 Objective-C 启动实例类型