在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)