Swift 基本语法(十)— 协议扩展

swift里强大的协议

 swift里的协议,可以当做类型使用。 
 可以作为函数的形参,以及返回值
 作为常量、变量、以及属性类型
 作为数组、字典等其他存储类型的元素的类型
协议的基本使用
protocol CustomProtocol {
    //注意:协议里定义属性,必须制定样式,可读、可写。 定义协议属性使用var
    // 默认遵循协议必须实现对应属性、方法
    var customName: String { get }
    var age: Int { get set}
    
    //在协议中定义类型属性,要加static关键字
    static var temp: String { get }
    
    //定义方法  可以实例方法,也可以类方法. 方法参数不可以有默认值.  方法不用大括号
    func addProtocolFunction(_ name: String)
    
    func anotherProtocolFunction(age: Int) -> String
    
    //协议也可以定义初始化器. 遵循协议的类必须使用required关键修饰
    init(someParams: String)
    
    //可选类型 添加@objc, 可以与OC混合变成。  只能被继承自OC类或者其他objc锁遵循,结构体枚举也不行
    @objc
    
}

//某个类遵循协议。 如果你没有实现协议内容,会报错, 默认必须实现
class Person: CustomProtocol {
    // 协议里的初始化器
    required init(someParams: String) {
        
    }
    
    var age: Int = 0
    var customName: String {
        return "customName"
    }
    
    static var temp: String = "New temp"
    
    func anotherProtocolFunction(age: Int) -> String {
        return "another protocol func"
    }
    
    func addProtocolFunction(_ name: String) {
        print("Protocol func")
    }
}

协议继承

//子类继承并遵循o某个协议写法.
//如果子类重写了父类的指定初始化器,并x遵循协议实现了初始化器要求,那么要为这个初始化器加上required override 关键字
class Child: Person, CustomProtocol {
    required override init() {

    }
}


//x协议也可以继承
protocol subProtocol: CustomProtocol {
    
}

//类专用协议  添加anyObject关键字
protocol SomeOnlyClassProtocol: AnyObject {
    //只能s类遵循的协议,结构体枚举不可以使用
}

协议组合

//协议组合  多个协议使用&链接
protocol Name {
    var name: String { get }
}
protocol Age {
    var age: Int { get }
}
class Man: Name, Age {
    var name: String = ""
    var age: Int = 0
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}
//协议组合 &
func happyBirthDay(man: Name & Age) {
    print("name :\(man.name) age: \(man.age)")
}
let man = Man(name: "zhangsan", age: 30)
happyBirthDay(man: man) // name :zhangsan age: 30
//在扩展里添加协议
//有条件的遵循某个协议
extension Array: Name where Element: Name {
    var name: String {
        return "new Name"
    }
}
//协议也可以扩展
extension Name {
    func extensionFunc() -> Void {
        print("协议扩展方法")
    }
}

由于很多种语言都不支持多继承。 所以可以使用POP(面向协议编程)来解决类似多继承的问题。
面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)
继承机制带来的问题: 由于不支持多继承,因此会在父类里塞入很多无关的属性及方法,这在以后的子类里可能会出现误使用。
修改结构很困难,不确定对父类或子类的影响。 pop修改行为,只修改具体的方法即可,这比修改结构简单多了。
OOP:主要关心对象是什么 POP:主要关心对象做什么
举个栗子🌰:
登录界面,校验用户名及密码。
OOP: 一般就直接在VC里添加两个函数,判断用户名、密码是否正确。 在优一点的,单独写一个工具类,来做校验。
使用的时候,初始化两个对象,来分别判断用户名及密码。

POP: 写一个协议,使用扩展,做用户名及密码的校验,后续再有什么新增校验方法,都在这里加就好了。
使用:直接让登录类遵循协议,就可以直接使用判断方法了。

//校验用户名及密码协议
protocol CheckUsenamePasswordProtocol {
    func checkUseName(usename: String) -> Bool
    func checkPassword(password: String) -> Bool
}
//扩展实现校验方法。  如果后续在加什么额外的条件,直接在这里加即可
extension CheckUsenamePasswordProtocol {
    func checkUseName(usename: String) -> Bool {
        if usename.count <= 0 {
            return false
        }else if usename == "username" {
            return false
        }else {
            return true
        }
    }
    
    func checkPassword(password: String) -> Bool {
        if password.count < 6 {
            return false
        }else if password.contains("@#$%!") {
            return false
        }
        return true
    }
    
//    //使用guard 方式 遵循黄金大道编程习惯
//    func TestGoldRoadFunction(str: String) -> Bool {
//        guard str.count < 6 else {
//            return false
//        }
//        guard str.contains("#$%@") else {
//            print("没有特殊字符")
//            return false
//        }
//        guard str.count > 12 else {
//            print("太长了")
//            return false
//        }
//        return true
//    }
}

//使用
class Login: CheckUsenamePasswordProtocol {
    func loginButton() -> Void {
        //直接就能调用校验方法
        if checkUseName(usename: "name") && checkPassword(password: "password"){
            print("成了")
        }
    }
}
let login = Login()
login.loginButton()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342