哪些 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 中转换为 float
,NSArray?
和 Array<String>?
都转换为 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 “使用未声明的类型”