美文网首页
4.1、协议

4.1、协议

作者: 艾希_可可 | 来源:发表于2018-06-27 11:13 被阅读4次

    //: Playground - noun: a place where people can play

    import UIKit
    //“什么是协议以及为什么使用它们。
    //如何学习和采用Swift协议?
    //如何检查自定义类型的实例是否相等、大于或小于?
    //如何将自定义对象的自定义信息打印到控制台?

    //协议规定了用来实现某一特定功能所必需的方法和属性。
    //任意能够满足协议要求的类型被称为遵循(conform)这个协议。
    //类,结构体或枚举类型都可以遵循协议,并提供具体实现来完成协议定义的方法和功能。
    //注:本小节总结协议以及依靠协议实现委托,这将在以后经常被使用。是一个非常重要的模块
    //语法
    //1、协议的语法格式如下:
    protocol SomeProtocol {
    // 协议内容
    }
    protocol AnotherProtocol{

    }
    //2、类遵循某个协议,需要在类型名称后加上协议名称,中间以冒号:分隔,作为类型定义的一部分。遵循多个协议时,各协议之间用逗号,分隔。
    struct SomeStructure: SomeProtocol, AnotherProtocol {
    // 结构体内容
    }
    //3、对属性的规定
    //协议用于指定特定的实例属性或类属性,而不用指定是存储型属性或计算型属性。此外还必须指明是只读的还是可读可写的。
    //协议中的通常用var来声明变量属性,在类型声明后加上{ set get }来表示属性是可读可写的,只读属性则用{ get }来表示。
    protocol classa {
    var marks: Int { get set }
    var result: Bool { get }
    //函数不用{}
    func attendance() -> String
    func markssecured() -> String

    }
    //在协议中你可以定义实例方法 , 也可以定义类方法 ,其方法和属性定义差不多。
    protocol MethodPro{
    func plus(a:Int , b:Int)->Int
    static func toUpper(str:String)->String
    }
    class MethodClass: MethodPro {

    func plus(a: Int, b: Int)->Int {
        return a + b
    }
    class func toUpper(str: String)->String {
        return str.uppercased()
    }
    

    }
    //4、委托(代理)模式
    protocol SayHelloDelegate{
    func sayHello(name:String);
    }
    class ClassA {
    var delegate:SayHelloDelegate?
    var name = "lucy"
    func play(){
    delegate?.sayHello(name: name);
    }
    }
    class ClassB:SayHelloDelegate {//谁继承谁收到传过来的值
    var name="lily"
    func sayHello(name:String) {
    print("(name) 请 (self.name) 帮她 say Hello");
    }
    }
    //我们这里定义了一个协议 ,有个很简单的方法,sayHello ,在A中声明了这个协议变量 ,使用了其方法 ,但这个方法却交给B去实现 。这就是一个很简单的代理模式
    var ca = ClassA();
    var cb = ClassB()
    ca.delegate = cb
    //B代理A去实现方法
    ca.play(); //lucy 请 lily 帮她 say Hello

    //5、协议可继承,可扩展
    protocol classb: classa {
    var present: Bool { get set }
    var subject: String { get set }
    var stname: String { get set }

    }
    class classc: classb {
    var marks = 96
    let result = true//可以声明为可读可写的,
    // var result: Bool {return false}//也可以是只读
    var present = false
    var subject = "Swift 协议"
    var stname = "Protocols"

    func attendance() -> String {
        return "The \(stname) has secured 99% attendance"
    }
    
    func markssecured() -> String {
        return "\(stname) has scored \(marks)"
    }
    

    }
    let studdet = classc()
    studdet.stname = "Swift"
    studdet.marks = 98
    studdet.markssecured()
    //studdet.result = false
    print(studdet.marks)
    print(studdet.result)
    print(studdet.present)
    print(studdet.subject)
    print(studdet.stname)

    extension classb{
    func sayGoodBye(){
    print("good-bye")
    }
    }
    //练习page454
    //1、以下不是swift标准库中常用的协议!4
    //A自定义可转换的字符串B方程表C类似的比较D声音播放器
    //2 为什么要在构建应用程序时使用协议?5
    //A共享不同类型的属性和功能。B使自定义类型与系统或调试功能配合得很好。C增强相似性并提供类型功能。D定义事件,但将实现委托给另一个类型的实例。
    //3 如何为在swift标准库中定义的类型采用自定义协议? 2
    //4 在使用打印功能时,必须采用哪个协议来提供自定义文本? 1自定义字符串转换
    //5 采用哪个协议判断两个类是否相等 2
    //6 3

    相关文章

      网友评论

          本文标题:4.1、协议

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