一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Swift中的協議(protocol)學習教程

Swift中的協議(protocol)學習教程

2020-09-01 09:17琿少 Python

協議中可以定義一些基本的需要被實例化的屬性,這里我們就來看一下Swift中的協議(protocol)學習教程,需要的朋友可以參考下

一、引言

協議約定了一些屬性與方法,其作用類似Java中的抽象類,Swift中類型通過遵守協議來實現一些約定的屬性和方法。Swift中的協議使用protocol關鍵字來聲明。Swift中的協議還有一個十分有意思的特性,協議可以通過擴展來實現一些方法和附加功能。

二、在協議中定義屬性和方法

協議中定義的屬性只約定名稱和類型,在具體類型的實現中,其可以是存儲屬性也可以是計算屬性,協議中還需要指定屬性是可讀的還是可讀可寫的。示例代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
protocol MyPortocol {
  //定義實例屬性
  //可讀的
  var name:String{get}
  //可讀可寫的
  var age:Int{set get}
  //可讀的
  var nameAndAge:String{get}
  static var className:String{get}
}
class MyClass: MyPortocol {
  var name: String
  var age: Int
  var nameAndAge: String{
    get{
      return "\(name)"+"\(age)"
    }
  }
  static var className: String{
    get{
      return "MyClass"
    }
  }
  init(){
    name = "HS"
    age = 24
  }
}

有一點需要注意,協議中的可讀并不是只讀,協議中的屬性約定成可讀可寫,則在實現時,這個屬性必須是可讀可寫的,但是如果協議中約定成可讀的,則此屬性可以是只讀的也可以是可讀可寫的,看具體的實現。

協議中約定的方法可以是實例方法也可以是類型方法,示例如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
protocol MyPortocol {
  func logName()
  static func logClassName()
}
class MyClass: MyPortocol {
  var name: String
  var age: Int
  init(){
    name = "HS"
    age = 24
  }
  func logName() {
    print(name)
  }
  static func logClassName() {
    print(className)
  }
}

同樣,協議中也可以對構造方法進行定義約定。

三、協議的特點

協議中雖然沒有任何屬性和方法的實現,但是其仍然可以當做類型來使用,在函數參數、返回值中應用廣泛,示例如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
protocol MyPortocol {
  //定義實例屬性
  var name:String{get}
  var age:Int{set get}
  var nameAndAge:String{get}
  static var className:String{get}
  func logName()
  static func logClassName()
}
//將協議類型作為參數
func test(param:MyPortocol) {
  param.logName()
}

協議作為類型這種用法另一個應用點是在集合類型中,協議可以作為所有遵守此協議的集合類型。

協議可以像其他類型一樣進行繼承,子協議將自動擁有父協議約定的屬性和方法。協議也可以通過class關鍵字來定義只有類可以進行遵守,示例如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
protocol MyPortocol {
  //定義實例屬性
  var name:String{get}
  var age:Int{set get}
  var nameAndAge:String{get}
  static var className:String{get}
  func logName()
  static func logClassName()
}
//只有類可以繼承此協議
protocol MySubPortocol:class,MyPortocol {
  
}

協議既然可以像其他類型一樣進行使用,當然它也可以使用is,as?,as!進行檢查和轉換,關于is,as的更多用法可以查看Swift關于類型轉換的內容。

協議也可定義其中的屬性或方法為可選的,即遵守此協議的類可以實現也可以不實現可選的屬性和方法,然而,聲明為可選的需要此協議為@objc類型的,示例如下:

?
1
2
3
4
5
6
7
8
9
10
@objc protocol MyPortocol {
  //定義實例屬性
  var name:String{get}
  var age:Int{set get}
  var nameAndAge:String{get}
  static var className:String{get}
  func logName()
  //可選實現
  optional static func logClassName()
}

Swift中的協議還有一個十分重要的特性,其可以通過擴展來進行屬性、方法以及下標的實現。這對于一些通用類的方法十分方便,這相當于所有繼承此協議的類都默認實現了這樣的方法,示例如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
protocol MyPortocol {
  //定義實例屬性
  var name:String{get}
  var age:Int{set get}
  var nameAndAge:String{get}
  static var className:String{get}
  func logName()
  static func logClassName()
}
extension MyPortocol{
  var name:String{
    return "HS"
  }
}

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲国产高清一区二区三区 | 美女扒开两腿露出尿口的视频 | 欧美伊香蕉久久综合类网站 | 无码人妻少妇色欲AV一区二区 | 国产v日韩v欧美v精品专区 | 国产成人无精品久久久久国语 | 强插美女 | 亚洲天堂网站在线 | 九九精品视频在线播放 | 四虎永久免费地址 | 免费一级日本c片完整版 | 亚洲乱亚洲乱妇41p国产成人 | 91精品导航在线观看 | 日本四虎影院 | 久久婷婷五月综合色丁香花 | 成人国产精品一级毛片视频 | 果冻传媒天美传媒乌鸦传媒 | asianfemdom冷柔女王| 黑帮少爷爱上我第8集在线观看 | 欧美se图 | 韩国帅男同gay网站 韩国三级在线播放 | 国产成人精品一区二三区在线观看 | 日日插插 | 亚洲羞羞裸色私人影院 | 国产酒店自拍 | 91免费视频国产 | 久久草福利自拍视频在线观看 | 91亚洲精品第一综合不卡播放 | 水野朝阳厨房系列在线观看 | 天堂在线中文无弹窗全文阅读 | 禁止的爱善良的未删减版hd | 国产一区日韩二区欧美三 | 精品视频一区二区 | 特黄特黄aaaa级毛片免费看 | 青青网| 美女舒服好紧太爽了视频 | 日韩精品一区二区 | 天天gan | 亚洲免费色图 | 色女阁| 丁香五香天堂 |