協議規定了用來實現某一特定功能所必需的方法和屬性。
任意能夠滿足協議要求的型別被稱為遵循(conform)這個協議。
類、結構體或列舉型別都可以遵循協議,並提供具體實現來完成協議定義的方法和功能。
語法協議的語法格式如下:
protocol SomeProtocol { // 協議內容}
要使類遵循某個協議,需要在型別名稱後加上協議名稱,中間以冒號:分隔,作為型別定義的一部分。遵循多個協議時,各協議之間用逗號,分隔。
struct SomeStructure: FirstPortocol, AnotherProtocol { // 結構體內容}
如果類在遵循協議的同時擁有父類,應該將父類名放在協議名之前,以逗號分隔。
class SomeClass: SomeSuperClass, FirstProtocol, AnotherProtocol { // 類的內容}
對屬性的規定
協議用於指定特定的例項屬性或類屬性,而不用指定是儲存型屬性或計算型屬性。此外還必須指明是隻讀的還是可讀可寫的。
協議中的通常用var來宣告變數屬性,在型別聲明後加上{set get}來表示屬性是可讀可寫的,只讀屬性則用{get}來表示。
protocol someClass {// 可讀可寫屬性 var marks: Int {set get}// 只讀屬性 var result: Bool {get} func attendance() -> String func markssecured() -> String}protocol anotherClass: someClass { var present: Bool {get set} var subject: String {get set} var stname: String {get set}}class classStudent: anotherClass { var marks: Int = 96 var result: Bool = true var present: Bool = false var subject: String = "Swift 協議" var name: String = "Protocols" func attendance() -> String { return "The \(name) has secured 99% attendance" } func markssecured() -> String { return "\(name) has scored \(marks)" }}let student = classStudent()student.name = "Swift"student.marks = 98student.markssecured()print(student.marks, student.result, student.present, student.subject, student.name)
對Mutating方法的規定有時需要在方法中改變它的例項。
例如:值型別(結構體,列舉)的例項方法中,將mutating關鍵字作為函式的字首,寫在func之前,表示可以在該方法中修改它所屬的例項及其例項屬性的值。
protocol week { mutating func show()}enum days: week { case sun, mon, tue, wed, thurs, fri, sat mutating func show() { switch self { case .sun: self = .sun print("週日") case .mon: self = .mon print("週一") case .tue: self = .tue print("週二") case .wed: self = .wed print("週三") case .thurs: self = .thurs print("週四") case .fri: self = .fri print("週五") case .sat: self = .sat print("週六") default: print("查無此日") } }}var res = days.wedres.show()
最新評論