【问题标题】:How are Objective-C factory methods converted into Swift convenience initializers?Objective-C 工厂方法如何转换为 Swift 便利初始化器?
【发布时间】:2014-06-13 21:32:26
【问题描述】:

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

“init”前缀被切掉,成为一个关键字,表明该方法是一个初始化器。对于以“initWith”开头的初始化方法,“With”也会被删除。将“init”或“initWith”分开的选择器片段的第一个字母变为小写,并且该选择器片段被视为第一个参数的名称。其余的选择器部分也对应于参数名称。

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

为了一致性和简单性,Objective-C 工厂方法被映射为 Swift 中的便利初始化器。这种映射允许它们使用与初始化器相同的简洁、清晰的语法。例如,在 Objective-C 中,你可以像这样调用这个工厂方法:

目标-C

UIColor *color = [UIColor colorWithRed:0.5 green:0.0 blue:0.5 alpha:1.0];

在 Swift 中,你可以这样称呼它:

斯威夫特

let color = UIColor(red: 0.5, green: 0.0, blue: 0.5, alpha: 1.0)

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

【问题讨论】:

    标签: objective-c swift


    【解决方案1】:

    根据我通过玩弄的结果,以下规则用于将工厂方法转换为便利初始化程序。

    1. 列表项
    2. 方法是类方法
    3. 返回类型为instancetypeMyClassName *
    4. 方法至少需要一个参数
    5. 方法名以“类名后缀”开头;即类名的后缀,限制不能有部分单词。第一个字母可以选择小写。

    类名后缀(可选地后跟“With”,就像initWith 转换中一样)被去掉,方法名的其余部分用于第一个参数,第一个字母小写。

    例如,以下转换适用:

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

    注意:因为它们都映射到同一个 swift 初始化器,所以只有一个可用(通常是第一个声明的)

    【讨论】:

    • 我看到这是一个自问自答的帖子……但是如果您想对此进行扩展,来自 WWDC 的深入互操作视频非常好。
    • @JackWu 该视频非常有助于获得基本的理解,但在工厂方法方面并没有比文档更深入
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    • 2019-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多