首页 文章

Objective-C工厂方法如何转换为Swift便捷初始化器?

提问于
浏览
7

Apple's documentation非常清楚Objective-C初始化方法如何转换为Swift初始化器:

“init”前缀被切掉并成为关键字以指示该方法是初始化器 . 对于以“initWith”开头的init方法,“With”也会被切掉 . 选择器块的第一个字母“init”或“initWith”从它中分离出来,变成小写,并且选择器块被视为第一个参数的名称 . 其余的选择器部分也对应于参数名称 .

也可以使用工厂类方法作为初始化器;但是,关于这些选择器名称如何映射到Swift函数的信息要少得多:

为了一致性和简单性,Objective-C工厂方法被映射为Swift中的便捷初始化器 . 此映射允许它们使用与初始化程序相同的简洁,清晰的语法 . 例如,在Objective-C中,您可以像这样调用此工厂方法:OBJECTIVE-C UIColor * color = [UIColor colorWithRed:0.5 green:0.0 blue:0.5 alpha:1.0];
在Swift中,你这样称它:SWIFT让color = UIColor(红色:0.5,绿色:0.0,蓝色:0.5,alpha:1.0)

将Objective-C工厂方法映射到Swift初始化器的规则是什么?

1 回答

  • 6

    从我刚才能够解决的问题来看,以下规则用于将工厂方法转换为便利初始化器 .

    • 列出项目

    • Method是一个类方法

    • 返回类型是 instancetypeMyClassName *

    • Method至少需要一个参数

    • 方法名称以"class name suffix"开头;也就是说,类名的后缀,限制你不能有部分单词 . 第一个字母可以可选地是小写字母 .

    剥离类名后缀(可选地后面跟"With",类似于 initWith 转换),方法名称的其余部分用于第一个参数,第一个字母是低位的 .

    例如,以下转换适用:

    [MyClassName myClassNameWithObject:obj] → MyClassName(object: obj)
    [MyClassname classNameWithObject:obj]   → MyClassName(object: obj)
    [MyClassName nameObject:obj]            → MyClassName(object: obj)
    

    注意:由于这些都映射到相同的swift初始化程序,因此只有一个可用(通常是第一个声明的)

相关问题