本篇假设你已经了解了@dynamicMemberLookup的作用,如果还没掌握,请自行搜索
有时候为了自定义某些功能,我们会自已封装一个view,比如实现一个自定义的搜索框,内部使用了系统的UITextField:
class MySearchView: UIControl {
private let textField: UITextField
}
但是当你在外部要调用UITextField的属性时怎么办呢?你可能会加上一些下面的方法:
extension MySearchView {
var placeholder: String {
get { textField.placeholder }
set { textField.placeholder = newValue }
}
var delegate: UITextFieldDelegate? {
get { textField.delegate }
set { textField.delegate = newValue }
}
}
这么写一两种属性还好,假设如果需要写100种,就会充斥太多模板代码.更别说万一以后苹果改了某些api,你还要挨个set get修改一遍
这时候dynamicMemberLookup就派上用场了,我们把MySearchView改成这样:
@dynamicMemberLookup
class MySearchView: UIControl {
private var textField: UITextField
// 必须要实现的方法
subscript<T>(dynamicMember keyPath: WritableKeyPath<UITextField, T>) -> T {
get { textField[keyPath: keyPath] }
set { textField[keyPath: keyPath] = newValue }
}
}
只有这么多代码,也不需要自己去写各种无聊的set get了. 它能帮你省去写一大堆模板代码.
这时候客户端也可以直接调用:
let searchView = MySearchView()
searchView.placeholder = "placeholder"
searchView.delegate = self
网友评论