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

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)