首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何编写一个通用的Swift类函数来使用闭包初始化类?

如何编写一个通用的Swift类函数来使用闭包初始化类?
EN

Stack Overflow用户
提问于 2019-06-06 01:50:18
回答 1查看 70关注 0票数 0

我正在尝试为Swift类编写一个泛型类函数,它允许我使用尾部闭包语法来初始化类。

我已经让它在特定的类上工作了,比如UILabel。

代码语言:javascript
复制
// Extension for UILabel
extension UILabel {
    class func new(_ initialization: (inout UILabel) -> Void) -> UILabel {
        var label = UILabel()
        initialization(&label)
        return label
    }
}

// Initialize new UILabel using trailing closure syntax and "new" function
let label = UILabel.new {
    $0.textColor = .red
}

但是,我希望为NSObject的所有子类提供此功能,因此我正在尝试实现上述“新”函数的泛型版本。到目前为止,我已经想出了这个:

代码语言:javascript
复制
extension NSObject {
    class func new(_ initialization: (inout Self) -> Void) -> Self {
        var newSelf = Self()
        initialization(&newSelf)
        return newSelf
    }
}

但这会产生以下错误:“Self”仅在协议中可用或作为类中方法的结果;您的意思是“NSObject”吗?

我正在使用Swift 5.1 (Xcode11测试版)的游乐场进行尝试。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-06 03:17:43

正如Hamish所说,也许把初始化放在外面更好,这样更灵活。但是,可以使用协议来解决此问题。

代码语言:javascript
复制
protocol Initializable {
    init()
}

extension Initializable {
    static func new(_ initialization: (inout Self) -> Void) -> Self {
        var newSelf = Self()
        initialization(&newSelf)
        return newSelf
    }
}

extension NSObject: Initializable {}

NSObject已经有了一个init,所以它会自动符合Initializable。然后在协议上写上你的扩展名。

唯一需要注意的是,您现在不能使用class修饰符,因为您处于protocol中。

不确定这是否会导致 NS_UNAVAILABLE 修饰符出现问题,我认为当您在隐藏init.的类上使用它时,它可能会在运行时崩溃。

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

https://stackoverflow.com/questions/56465632

复制
相关文章

相似问题

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