Swift学习笔记

Swift - 面向协议编程 (POP)

2022-05-22  本文已影响0人  aven_kang
OOP (面向对象编程)的不足
截屏2022-03-10 下午3.00.17.png
POP的解决方案
截屏2022-03-10 下午3.01.14.png

POP的注意点

1.优先考虑创建协议,而不是父类(基类)
2.优先考虑值类型(struct,enum),而不是引用类型(class)
3.巧用协议的扩展功能
4.不要为了面向协议而使用协议
extension String {
    
    var numberCount: Int {
        
        var count = 0
        for c in self where ("0"..."9").contains(c) {
            count += 1
        }
        return count
    }
    
}
var str = "1234test1234"
print(str.numberCount)

在这个示例中,我们给String扩展了一个计算数字的功能,但是这种方法,有可能跟原有的类的功能或者方法冲突了,如何解决呢,可以更改功能的名字,这也是一种方法,下面使用另一种方法改造改造

struct HWK {
    
    var string:String
    init(_ string:String) {
        self.string = string
    }
    var numberCount: Int {
        
        var count = 0
        for c in string where ("0"..."9").contains(c) {
            
            count += 1
            
        }
        
        return count
    }
    
    
}

extension String {
    
    var mj:HWK {
        
        return HWK(self)
    }
    
}
var str = "1234test1234"
print(str.mj.numberCount) // 8

扩展

struct Person {
    
    var name:String
    var age:Int
    init?(_ dict:[String:Any]) {
        
        guard let name = dict["name"] as? String,
              let age = dict["age"] as? Int else {
                  return nil
              }
        self.age = age
        self.name = name
    }
}

struct HWK<Base> {
    
    var base:Base
    init(_ base:Base) {
        self.base = base
    }
    
}

extension Person {
    
    var mj:HWK<Person> {
        
        return HWK(self)
    }
    
}

extension String {
    
    var mj:HWK<String> {
        
        return HWK(self)
    }
    
    static var mj:HWK<String>.Type { HWK<String>.self }

    
}

extension HWK where Base == String {
    
    var numberCount:Int {
        
        var count = 0
        for c in base where ("0"..."9").contains(c) {
            count += 1
        }
        
        return count
    }
    static func test() {
          }
}

extension HWK where Base == Person {
    func run() { 
    }
}
        var str = "1234test1234"
        str.mj.numberCount
        // str.mj.run() 字符串是无法调用run方法的
        String.mj.test()
        
        var dict = ["string":"test"]
        var person = Person(dict)
        person?.mj.run()

Base:类

截屏2022-03-10 下午11.09.34.png
extension MJ where Base: Person 

这句的作用就是扩展MJ这个类,并且Base是Person类型的,也就是Person跟Person子类才能调用这个扩展里面的方法

Base: 协议

截屏2022-03-10 下午11.17.47.png

利用协议实现类型判断

截屏2022-03-11 下午6.40.52.png
上一篇下一篇

猜你喜欢

热点阅读