4.1、协议

//: 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、协议)