可以通过桥接将Swift Optional Int(Int?)暴露给Objective-C吗?

时间:2014-06-14 15:22:50

标签: objective-c swift

在从基于Obj-C的框架派生的Swift类中(但可以很容易地成为具有@objc属性的Swift类)我声明了两个存储的属性:

var optInt: Int?
var optString: String?

只有optString通过生成的-Swift.h头文件暴露给Obj-C。

的字符串?可能是好的,因为它是使用NSString对象公开的,它可以是nil,所以桥接有一种表示没有价值的方法。

如果我删除了?从optInt它暴露出一个NSInteger类型,所以我可以看到,对于非可选整数,它避免了对象和桥接值类型到值类型,但这是否真的意味着一个Int?不能曝光?

我似乎无法找到任何明确说明情况的文档。这里有一整套不兼容的Swift功能,这些功能不会显示在Using Swift from Objective-C

这里的用例是需要传递可以合法地为零的数字ID的经典情况。在Swift之前的世界中,NSNumber和nil正是我实现这一点的方式,但是尝试将类迁移到Swift然后在Swift类中专门为此而挂起Obj-C类型感觉是错误的。

我想我曾设想过Int?不像Int会在背景中作为NSNumber桥接,其可能的nil值为Swift中的可选项提供“无值”元素。

这里有什么我想念的吗?重申一下,可以通过桥接将Swift Optional Int(Int?)暴露给Objective-C吗?

2 个答案:

答案 0 :(得分:8)

Int?属性公开为NSNumber*的问题在于,您可以从Objective-C为其存储非Int兼容的NSNumber

您可以创建计算NSNumber?属性来包装Int?属性。 getter只返回Int?变量。 setter会将Int变量设置为-[NSNumber integerValue]

答案 1 :(得分:8)

这是上述解决方案的具体答案:

STUDENT
    ID    
    Name
    FavoriteCourseID
COURSE
    ID
    Name