泛型的扩展方法

时间:2017-07-04 07:01:50

标签: swift

kotlin中,我们可以扩展泛型类型apply函数的功能,例如:

inline fun <T> T.apply(block: T.() -> Unit): T

因此,我们可以使用此函数准确设置对象的属性,如下所示:

titleView.apply {
    setTextSize(10)
    setTextColor(RED)
}

甚至可以将常用样式保存为常量:

T.() -> Unit表示类型T的扩展函数,它返回单位(void,没有)

val TITLE_STYLE: TextView.() -> Unit = {
    setTextSize(10)
    setTextColor(RED)
}
//...
titleView.apply(TITLE_STYLE)

swift中有类似的东西吗?我最好的尝试看起来像:

func apply<T: UIView>(_ param: T, _ style: (T) -> ()) {
    style(param)
}

我们可以使用以下内容:

let titleLabel: UILabel = ...
apply(titleLabel) { label in
    label.font = UIFont(name: "SFUIText-Regular", size: 14)
    label.textColor = UIColor.red
}

或使用常数:

let accentTitle: (UILabel) -> () = { label in
    label.font = UIFont(name: "SFUIText-Regular", size: 12)
    label.textColor = UIColor.red
}
//...
apply(titleLabel, accentTitle)

是否可以在swift中编写apply作为扩展函数?这很丑陋并且可能在运行时失败:

extension NSObject {

    func apply<T>(_ style: (T) -> ()) {
        guard let obj = self as? T else {
            preconditionFailure("Object \(self) does not confirms to type: \(T.self)")
        }
        style(obj)
    }
}

titleLabel.apply() { (label: UILabel) in
    label.font = UIFont(name: "SFUIText-Regular", size: 14)
    label.textColor = UIColor.red
}

titleLabel.apply(accentTitle)

0 个答案:

没有答案