在从基于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吗?
答案 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