Swift 協議

Swift.png
協議的簡單介紹
  • 規定了用來實現某一特定任務或者功能的方法、屬性,以及其他需要的東西
  • 類、結構體 或枚舉都可以遵循協議,并為協議定義的這些要求提供具體實現(必須要實現協議的屬性或者方法)
  • 協議的格式:協議的定義方式與類、結構體和枚舉的定義非常相似
protocol SomeProtocol {
// 這里是協議的定義部分
}
  • 要讓自定義類型遵循某個協議,在定義類型時,需要在類型名稱后加上協議名稱,中間以冒號( : )分隔。遵循 多個協議時,各協議之間用逗號( , )分隔
struct SomeStructure: FirstProtocol, AnotherProtocol { // 這里是結構體的定義部分
}
  • 擁有父類的類在遵循協議時,應該將父類名放在協議名之前,以逗號分隔

class SomeClass: SomeSuperClass, FirstProtocol, AnotherProtocol { // 這里是類的定義部分
}

  • 協議是可以繼承的,一個協議可以繼承另外一個協議
屬性的要求
  • 協議可以要求遵循協議的類型提供特定名稱和類型的實例屬性或類型屬性。
  • 協議不指定屬性是存儲型屬性還是計算型屬性,它只指定屬性的名稱和類型。
  • 協議還指定屬性是可讀的還是可讀可寫的。
    • 如果協議要求屬性是可讀可寫的,那么該屬性不能是常量屬性或只讀的計算型屬性
    • 如果協議只要求屬性是可讀的,那么該屬性不僅可以是可讀的,如果代碼需要的話,還可以是可寫的。
  • 協議總是用 var 關鍵字來聲明變量屬性,在類型聲明后加上 { set get } 來表示屬性是可讀可寫的,可讀屬性則用 { get } 來表示
protocol SomeProtocol {
    var mustBeSettable: Int { get set }
    var doesNotNeedToBeSettable: Int { get }
}
  • 在聲明 類型屬性的時候可以使用 static或者 class關鍵字

//例子

//定義一個協議
protocol Work{
    var type:String {get set}
    var name:String {get set}
}

struct Type:Work{
  //類型必須聲明協議里面的屬性
    var type: String;
    var name: String;
}
//結構體有逐一構造器
let t = Type(type: "互聯網", name: "IT部門");
t.type
t.name
//打印:"互聯網"    "IT部門"

方法
  • 協議可以要求遵循協議的類型實現某些指定的實例方法或類方法
  • 協議里面定義的方法不需要大括號和方法體
  • 用 static或者class定義類型方法
//定義一個協議
protocol Run {
    
    func directionRun();
}


//定義一個枚舉
enum Direction:Run {
    
    case left
    case right
    case up
    case down
    func directionRun() {
        print("跑的方向")
    }
}

Direction.left.directionRun();

  • 將 mutating 關鍵 字作為方法的前綴,寫在 func 關鍵字之前,表示可以在該方法中修改它所屬的實例以及實例的任意屬性的值(在值類型中,主要是結構體和枚舉中)
  • Mutating 方法:需要在方法中改變方法所屬的實例
  • 如果遵循協議的是 類 則不用寫 mutating 關鍵字,而對于結構體和枚舉,則必須寫
    mutating 關鍵字。
//定義一個協議
protocol Togglable {
    mutating func toggle()
}

//定義一個枚舉 遵循協議Togglable
enum OnOffSwitch: Togglable {
    case Off, On
//更改自身的實例屬性
    mutating func toggle() {
        switch self {
        case .Off:
            self = .On
        case .On:
            self = .Off
          } 
     }
}



var lightSwitch = OnOffSwitch.Off;
lightSwitch.toggle()
// lightSwitch 現在的值為 .On

構造器
  • 協議可以要求遵循協議的類型實現指定的構造器
protocol SomeProtocol {
    init(someParameter: Int)
}
  • 你可以在遵循協議的類中實現構造器,無論是作為指定構造器,還是作為便利構造器。無論哪種情況,你都必須 為構造器實現標上 required 修飾符
class SomeClass: SomeProtocol {
    required init(someParameter: Int) {
// 這里是構造器的實現部分 }
}
  • 如果類已經被標記為 final ,那么不需要在協議構造器的實現中使用 required 修飾符,因為 final 類不能有子類

  • 如果一個子類重寫了父類的指定構造器,并且該構造器滿足了某個協議的要求,那么該構造器的實現需要同時標 注 required 和 override 修飾符

protocol SomeProtocol {
    init()
}
class SomeSuperClass {
    init() {
// 這里是構造器的實現部分
     }
}
class SomeSubClass: SomeSuperClass, SomeProtocol { // 因為遵循協議,需要加上 required
// 因為繼承自父類,需要加上 override
required override init() {
// 這里是構造器的實現部分
     }
}
代理
  • 代理(委托)是一種設計模式,允許類或結構體將一些需要它們負責的功能委托給其他類型的實例
//協議:遵循class類 方便delege屬性 weak
protocol Work:class {
    
    func test();
}

//工作的員工
class Person:Work {
    func test() {
        print("開始工作");
    }
    
}

//寵物狗
class Dog: Work {
    func test() {
        print("旺旺")
        
    }
}

//老板
class Master {
//weak:是修飾 類類型的
   weak var delegate:Work?
}

let M = Master();
//設置代理
M.delegate = Dog();
M.delegate?.test()

讓協議的方法可選
  • 在OC的協議中方法可以實現也可以不實現,但是在Swift中的協議中 方法必須要實現,解決方法 方swift中的協議 轉化成OC 中協議

@objc
protocol Work {
    //可選擇實現 方法
    @objc optional func test();
    
}

class Person:Work {
    
}

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 轉載:http://www.lxweimin.com/p/e70bd6645d88前言 熟悉Objective-C語...
    guoshengboy閱讀 1,052評論 0 1
  • 協議定義了一個藍圖,規定了用來實現某一特定任務或者功能的方法、屬性,以及其他需要的東西。類、結構體 或枚舉都可以遵...
    GY1994閱讀 1,405評論 0 0
  • 本章將會介紹 協議語法屬性要求方法要求(Method Requirements)Mutating 方法要求構造器要...
    寒橋閱讀 427評論 0 3
  • 協議語法 實現協議 擁有父類的類在采納協議時,應該將父類名放在協議名之前,以逗號分隔: 協議的屬性要求 協議不指定...
    666真666閱讀 1,711評論 0 2
  • 協議 協議是一種表示類型的相通性的方法,往往這些類型某些方面迥異。比如,一個Bee對象和一個Bird對象就在飛行方...
    小松樹先生閱讀 1,035評論 0 0