首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Swift可选Int (Int?)通过桥接暴露于Objective-C?

Swift可选Int (Int?)通过桥接暴露于Objective-C?
EN

Stack Overflow用户
提问于 2014-06-14 23:22:50
回答 2查看 16.3K关注 0票数 36

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

代码语言:javascript
复制
var optInt: Int?
var optString: String?

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

字符串?可能没有问题,因为它是使用可以为空的NSString对象公开的,因此桥接有一种表示无值的方法。

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

我似乎找不到任何明确说明这一点的文档。这里有一个不兼容的Swift功能的完整列表,它没有出现在上面:Using Swift from Objective-C

这里的用例是需要传递数字ID的典型情况,数字ID可以合法地为零。在之前的Swift世界中,NSNumber和nil正是我开始实现它的方式,但是试图将一个类迁移到Swift,但随后又专门出于这个原因而坚持使用Swift类中的Obj-C类型,这感觉是错误的。

我想我已经预想过Int?与Int不同的是,它会在后台作为一个NSNumber桥接,其潜在的nil值将提供给Swift中可选的"has no“元素。

我是不是漏掉了什么?重申一下,Swift可选Int (Int?)通过桥接暴露于Objective-C?

EN

回答 2

Stack Overflow用户

发布于 2017-04-04 20:28:29

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

代码语言:javascript
复制
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
}
票数 15
EN

Stack Overflow用户

发布于 2014-10-29 22:00:01

Int?属性公开为NSNumber*的问题在于,您可以从Objective-C向它存储一个非Int-compatible NSNumber

您可以创建一个计算的NSNumber?属性来包装Int?属性。getter将简单地返回Int?变量。设置器将从-[NSNumber integerValue]设置Int变量。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24221407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档