Tom*_*ley 30 objective-c swift
在从基于Obj-C的框架派生的Swift类中(但可以很容易地是具有@objc属性的Swift类),我声明了两个存储的属性:
var optInt: Int?
var optString: String?
Run Code Online (Sandbox Code Playgroud)
只有optString通过生成的-Swift.h头部暴露给Obj-C.
串?可能很好,因为它是使用NSString对象暴露的,它可以是nil,因此桥接有一种方法来表示没有价值.
如果我删除?从optInt它暴露出一个NSInteger类型,所以我可以看到,对于非可选整数,它避免了对象和桥接值类型到值类型,但这是否真的意味着一个Int?不能曝光?
我似乎无法找到明确说明这种情况的任何文档.这里有一个不兼容的Swift功能的完整列表,它们没有出现:使用Objective-C中的Swift
这里的用例是经典情况,需要传递一个合法地为零的数字ID.在Swift之前的世界中,NSNumber和nil正是我实现这一点的方式,但是尝试将类迁移到Swift然后在Swift类中专门用于Obj-C类型,这是错误的.
我想我曾设想过Int?不像Int会在背景中作为NSNumber桥接,其潜在的零值为Swift中的可选项提供"无值"元素.
这里有什么我想念的吗?重申一下,可以通过桥接将Swift Optional Int(Int?)暴露给Objective-C吗?
Ken*_*ses 11
暴露Int?
属性的问题NSNumber*
是您可以从Objective-C 存储与其不Int
兼容的属性NSNumber
.
您可以创建一个计算NSNumber?
属性来包装您的Int?
属性.getter只返回Int?
变量.setter会设置Int
变量-[NSNumber integerValue]
.
Jen*_*n C 11
以下是上述解决方案的具体答案:
private var _number: Int?
public var number: NSNumber? {
get {
return _number as NSNumber?
}
set(newNumber) {
_number = newNumber?.intValue
}
}
// In case you want to set the number in the init
public init(number: NSNumber?) {
_number = number?.intValue
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
11828 次 |
最近记录: |