美文网首页
RxSwift - 为自定义 get 属性添加命名空间

RxSwift - 为自定义 get 属性添加命名空间

作者: ienos | 来源:发表于2022-07-14 20:41 被阅读0次

通常我们为系统控件添加扩展时,为了快速定位到我们写的扩展属性,且独立于其他扩展,防止冲突。代码提示属性过多。我们会添加为扩展属性添加命名空间

如: userTextField 是在某个类中定义的 UITextField,假如我们给 UITextField 扩展一个 get 属性

extension UITextField {
    var isValid: Bool { self.text?.count ?? 0 > 0 }
}

调用时候是 self.userTextField.isValid,但是我们期望实现的效果是 self.userTextField.vs.isValid,试着写一下

extension UITextField {
    struct VS {}
    var vs: VS.Type { VS.self }
}
         
extension UITextField.VS {
    var isValid: Bool { self.text?.count ?? 0 > 0 }
}

text 无法通过 self 去获取,因为此时调用的实例是 UITextField.VS吗, 因此需要定义一个属性来获取原来的对象 userTextField

这里用 self.base 来获取原来的对象 userTextField

extension UITextField {
  struct VS {
      let base: UITextField
      init(_ base: UITextField) {
          self.base = base
      }
  }
  var vs: VS { VS.init(self) }
}

extension UITextField.VS {
    var isValid: Bool { self.base.text?.count ?? 0 > 0 }
}

这样可以初步实现我们的效果,但是如果其他系统控件也需要添加对应的扩展,那需要重复定义 struct VS {}

我们可以设想把 var vs: VS { VS.init(self) } 写成协议

struct VS<Base> {
    let base: Base
    init(_ base: Base) {
        self.base = base
    }
}
protocol VSProtocol {
   var vs: VS<Self> { get }
}
extension VSProtocol {
   var vs: VS<Self> { VS<Self>.init(self) }
}
extension NSObject: VSProtocol { }

这样写会发生报错

Protocol 'VSProtocol' requirement 'vs' cannot be satisfied by a non-final class ('NSObject') because it uses 'Self' in a non-parameter, non-result type position`

需要添加别名 associatedtype Base

struct VS<Base> {
    let base: Base
    init(_ base: Base) {
        self.base = base
    }
}
protocol VSProtocol {
    associatedtype Base
    var vs: VS<Base> { get }
}
extension VSProtocol {
   var vs: VS<Self> { VS<Self>.init(self) }
}
extension NSObject: VSProtocol { }

最后加上扩展,搞定

extension VS where Base: UITextField {
    var isValid: Bool { self.base.text?.count ?? 0 > 0 }
}

以上对 RxSwift 代码进行参考分析

相关文章

  • RxSwift - 为自定义 get 属性添加命名空间

    通常我们为系统控件添加扩展时,为了快速定位到我们写的扩展属性,且独立于其他扩展,防止冲突。代码提示属性过多。我们会...

  • Android相关知识点博客记录

    自定义属性 Android自定义View(二、深入解析自定义属性) Android中XML的命名空间、自定义属性 ...

  • NDK开发:C++基础

    一、命名空间 standard:标准命名空间 命名空间类似于java中的包。 自定义命名空间 使用命名空间 ::为...

  • Vue风格指南

    a.优先级A -- 私有属性名 在插件、混入等扩展中始终为自定义的私有属性使用 $_ 前缀。并附带一个命名空间以回...

  • 个人实用笔记

    1、自定义属性 命名空间:http://schemas.android.com/apk/res-auto,可以自动...

  • 2017/3/1 周三

    GET You 添加资料编辑界面、修改主界面逻辑 actionbar menu 使用app:命名空间 通过inte...

  • 4. 自定义控件(4) --- 自定义属性

    自定义属性 上面是布局文件 定义了三个自定义属性注意命名空间的问题 上面是values/attrs.xml文件的内...

  • Kotlin(五)类的属性

    1. 类属性默认有set() get() 方法,不需自定义时不需要自己手动添加 2. 自己自定义属性时需要将想自定...

  • iOS Swift 写一个自己的命名空间

    介绍 比如写一个 lg 为后缀的命名空间,类似于 RxSwift 中的 rx, Kingfisher 中的 kf,...

  • python3 常用方法

    对象 get set方法生成 自定义对象打印所有属性 使用方法 在自定义对象中 添加 下列方法 之后 直接pri...

网友评论

      本文标题:RxSwift - 为自定义 get 属性添加命名空间

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