如何在没有Swift参数的情况下调用Obj-c初始化器类方法

时间:2015-04-08 06:04:30

标签: objective-c swift

我在Obj-C中有一个类,它只能通过调用+new进行初始化,并且不支持-init

@interface SetupMainController : UIViewController
+(SetupMainController *)new;
-(id)init __attribute__((unavailable("Must use +new")));
@end

我试图在swift中运行以下等效的obj-c代码:

SetupMainController *setupController = [SetupMainController new];
[self presentViewController:setupController animated:YES completion:nil];
像这样:

let sc : SparkSetupMainController = SparkSetupMainController.new()

或:

let sc : SparkSetupMainController.new()

或:

let sc : SparkSetupMainController()

(显然试图调用-init被禁止) 一切都失败了 获得"预期会员名称'。'"错误。

我找到了thisthisapple docs等答案,但没有人直接回答如何在Swift中完成这个简单的任务。

帮助appriciated

1 个答案:

答案 0 :(得分:1)

如果您将Objective-C类中的new更改为:

+(id)mynew;

然后突然一切正常:

    var s: SetupMainController = SetupMainController.mynew()

不知道为什么你不能覆盖+new。也许是因为是一种类方法?

编辑:为了在这个问题上添加更多的神秘感,如果你在Apple的文档中查找new,则在Swift中定义使用:

class func `new`() -> Self!

反引号是否意味着“这是保留的”?

编辑2 :看起来new根本无法使用Swift

此代码无法编译:

let j = NSNumber.new()
var s = NSString.new()

编辑3::解决方案

new是Swift中的保留关键字,因此要调用+new(),您需要添加后面的标记:

let string = NSString.`new`()

感谢this answer