Swift - 面向协议编程 (POP)
2022-05-22 本文已影响0人
aven_kang
OOP (面向对象编程)的不足
截屏2022-03-10 下午3.00.17.pngPOP的解决方案
截屏2022-03-10 下午3.01.14.pngPOP的注意点
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.pngextension MJ where Base: Person
这句的作用就是扩展MJ这个类,并且Base是Person类型的,也就是Person跟Person子类才能调用这个扩展里面的方法