将Objective-C属性显式导入Swift作为选项

时间:2014-09-19 00:38:40

标签: ios objective-c swift

更新:从Xcode 6.3开始,现在可以通过nullability annotations进行此操作。

我一直想知道是否有人想办法将Obj-C属性显式导入Swift作为可选项。

问题

考虑以下ObjC类:

@interface Foo : NSObject
@property (strong, nonatomic) NSObject* potentiallyNil;
@end

这很好,但是当你在Swift中使用它时,Xcode倾向于将属性导入为正确的实例或隐式展开的可选项。

我已经看到这两个都进来了

class Foo : NSObject {
var potentiallyNil : NSObject
}

以及

class Foo : NSObject {
var potentiallyNil : NSObject!
}

现在问题就是这个问题 - 在Swift中,你现在遇到了知道这个丑陋的问题,你的财产可能是零,但必须避免美丽隐式可选转换。您可以选择以下选项之一:

明确的零检查......

if(potentiallyNil == nil) {
  bar()
}

或者手动转换为带有展开的可选类型 - 也很难看......

let manuallyWrappedPotentiallyNil : NSObject? = potentiallyNil
if let unwrapped = manuallyWrappedPotentiallyNil {
   bar();
}

这两者似乎都不太理想。在我看来,必须有一个方法来解决这个问题!事实上,正如@matt所指出的那样,Apple在整个测试版中都做到了这一点,同时审核了可选的合规性"。我们可以这样做吗?

问题

归结为:给定ObjC属性

@property (strong, nonatomic) NSObject* potentiallyNil;

有没有办法使用签名

将其导入Swift
var potentiallyNil : NSObject?

非常感谢所有其他iOS / OS X开发人员。

2 个答案:

答案 0 :(得分:1)

在提出这个问题时,这是不可能的。但是,在Xcode 6.3中,有一个新的nullability annotation功能可以启用此先前的私有功能。因此问题不再适用。

答案 1 :(得分:0)

如果你检查API接口代码,你会发现有Swift和Objective C版本的类。所以我猜这是Apple解决这个问题的方法吗?