Swift中extension的思考

最近在学习RxSwift,看到里面这种number1.rx.text.orEmpty写法感到很神奇:

class NumbersViewController: ViewController {
    @IBOutlet weak var number1: UITextField!
    @IBOutlet weak var number2: UITextField!
    @IBOutlet weak var number3: UITextField!

    @IBOutlet weak var result: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        
        Observable.combineLatest(number1.rx.text.orEmpty, number2.rx.text.orEmpty, number3.rx.text.orEmpty) { textValue1, textValue2, textValue3 -> Int in
                return (Int(textValue1) ?? 0) + (Int(textValue2) ?? 0) + (Int(textValue3) ?? 0)
            }
            .map { $0.description }
            .bind(to: result.rx.text)
            .disposed(by: disposeBag)
    }
}

于是就研究写了一下:

import Foundation
import UIKit

// 会返回自身,相当于rx里面的base(number1.rx.base)
protocol ZFInstance {
    associatedtype DT
    var instance: DT { get }
}
// 像是命名空间,相当于RxSwift里面的rx
protocol ZFNameSpace {
    associatedtype DT
    
    var zf: DT { get }
}
// 相当于RxSwift里面的Reactive
public final class ZFBase<T>: ZFInstance {
    typealias DT = T
    
    public let instance:T
    public init(instance:T) {
        self.instance = instance
    }
}
// Int
extension Int: ZFNameSpace {
    var zf:ZFBase<Int> {
        return ZFBase(instance: self)
    }
}

extension ZFInstance where DT == Int {
    var doubleValue:String {
        let value = instance * 2
        return "\(instance) + \(instance) = \(value)"
    }
}
// String
extension String: ZFNameSpace {
    var zf:ZFBase<String> {
        return ZFBase(instance: self)
    }
}

extension ZFInstance where DT == String {
    var hello:String {
        return "hello," + instance
    }
}
// UIView
extension UIView: ZFNameSpace {
    var zf:ZFBase<UIView> {
        return ZFBase(instance: self)
    }
}

extension ZFInstance where DT == UIView {
    var viewName:String {
        return instance.description
    }
}
let v = UIView()

print(v.zf.viewName)
print(1.zf.doubleValue)
print("fan".zf.hello)
print(v.zf.instance)

打印结果:

<UIView: 0x7fd23bf0cab0; frame = (0 0; 0 0); layer = <CALayer: 0x608000038d00>>
1 + 1 = 2
hello,fan

这么写有什么好处呢,或者说不这样写有什么缺点:
1、项目组内谁都可以写扩展,如果没有很好的沟通或管理,那么会出现很多功能相似的扩展,会导致一些沟通上,重复代码,维护困难等问题。
2、可能造成一些命名冲突。
3、将不同的功能组织的代码放在不同的空间里。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,663评论 25 708
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,010评论 19 139
  • gRPC 简介: gRPC 是一款高性能、开源的 RPC 框架,产自 Google,基于 ProtoBuf 序列化...
    谢烟客阅读 10,567评论 6 36
  • 谜语与谜底,已过经年锦无数次听到有人给自己出些五花八门的谜语,谜底也是分门别类,各不相同,但是唯一相同的是锦...
    安静城1阅读 242评论 0 1
  • 今天一个朋友对我说,本来在安心准备托福考试的她,在还有一周的时候又受到外界的干扰,再次陷入思考人生的迷茫之中,明知...
    爱睡觉的漂漂阅读 551评论 0 0