【问题标题】:How to invoke [self new] in Swift如何在 Swift 中调用 [self new]
【发布时间】:2015-02-08 12:23:15
【问题描述】:

这是一个用 ObjectiveC 编写的 UIView 扩展,用于轻松创建使用自动布局的视图:

+(id)autolayoutView
{
    UIView *view = [self new];
    view.translatesAutoresizingMaskIntoConstraints = NO;
    return view;
}

它调用[self new],所以 UIView 的任何子类都可以使用这个方法。如何在 Swift 中实现这一点?

【问题讨论】:

  • 在 objC 中将其写为 UIView 类别并将其桥接到 swift? swift 并不是真正意义上的动态

标签: objective-c swift uiview


【解决方案1】:

好的,这似乎是解决方案。该类型必须有一个带有正确参数列表的 required 初始化程序(在这种情况下没有参数)。

class SubView: UIView {
    override required init() {
        super.init()
    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    class func autolayoutView() -> UIView {
        var view = self()
        view.setTranslatesAutoresizingMaskIntoConstraints(false)
        return view
    }
}

【讨论】:

  • 与 ObjC 方式相比,这非常笨拙。我真的希望 Swift 像 ObjC 一样是一种完全动态的语言,只是语法更简洁。 F-Script 或 nu 之类的东西。
  • 是的,self() 确实有效。但是你不需要做子类。看我的回答。
【解决方案2】:

虽然 Carrl 和 Gregory Higley 都对那里的解决方案是正确的,包括关于 self() 需要使用所需的初始化这一事实的评论,但我想发布一个更一般的示例:

class Human {
    var gender = String()
    required init() {
        self.gender = "any"
    }
    class func newHuman() -> Human {
        return self()
    }
}

class Man : Human {
    required init() {
        super.init()
        self.gender = "male"
    }
}

var someMan = Man.newHuman()
println(someMan.gender) // male

【讨论】:

  • 这几乎和我在 Playground 实验中使用的代码完全相同,只是我使用了缺乏想象力的 FooBar
【解决方案3】:

受到 Gregory Higley 的启发,我认为解决方案就在这里:

extension UIView{
    class func autolayoutView() -> UIView {
        var view = self()
        view.setTranslatesAutoresizingMaskIntoConstraints(false)
        return view
    }
}

Swift2.1 更新:

extension UIView{
    class func autolayoutView() -> UIView {
        let view = self.init()
        view.translatesAutoresizingMaskIntoConstraints = false
        return view
    }
}

【讨论】:

  • 啊,是的。我错过了你说“UIView 扩展”的部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-07
  • 1970-01-01
  • 2015-04-07
  • 1970-01-01
相关资源
最近更新 更多