美文网首页
Swift-一个利用@dynamicMemberLookup改善

Swift-一个利用@dynamicMemberLookup改善

作者: 丶丶夏天 | 来源:发表于2021-12-16 14:30 被阅读0次

本篇假设你已经了解了@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

相关文章

网友评论

      本文标题:Swift-一个利用@dynamicMemberLookup改善

      本文链接:https://www.haomeiwen.com/subject/ghlvfrtx.html