# Swift 協議 Protocol
```
protocol Pet{
// 對于屬性,不能有初始值
var name: String{ get set }// = "My Pet"
// 統一使用var關鍵字
var birthPlace: String{ get }
// 對于屬性,get,set隱藏了實現細節,可以使用let實現只讀,也可以使用只有get的計算型屬性
// 對于方法,不能有實現
func playWith()
// 對于方法,不能有默認參數(默認參數就是一種實現)
//func fed(food: String = "leftover")
func fed()
func fed(food: String)
// 可以使用mutating關鍵字,強調這個方法應該修改其內容
mutating func changeName(newName:String)
// 不可以設置訪問控制
// 協議就是協議,如果開發者可以看見協議,就可以看見協議里的任何內容
}
// 不能實例化Pet
//var pet = Pet()
// 協議的繼承
protocol PetBird: Pet{
var flySpeed: Double{ get }
var flyHeight: Double{ get }
}
// 協議的實現,實現協議規定的所有屬性和方法即可
struct Dog: Pet{
// 可以使用計算型屬性
// private var myDoggyName = "Puppy"
// var name: String{
// get{
// return myDoggyName
// }
// set{
// myDoggyName = newValue
// }
// }
var name: String
// protocol的read-only,對一個具體類的實現,不一定只讀,但是作為Pet是只讀的!
//let birthPlace: String
var birthPlace: String
func playWith() {
print("Wong!")
}
func fed(){
print("I want a bone.")
}
// 在具體實現上可以加默認參數
func fed(food: String = "Bone"){
if food == "Bone"{
print("Happy")
}
else{
print("I want a bone")
}
}
// 對于class,不需要mutating關鍵字
mutating func changeName(newName: String) {
name = newName
}
}
let myDog:Dog = Dog(name: "summer", birthPlace: "beijing")
// 從 Pet 的角度看,myDog 的 birthPlace 是只讀的!
let aPet: Pet = myDog
//aPet.birthPlace = "shanghai"
```
```
protocol Pet{
var name: String{ get set }
init(name: String)
func playWith()
func fed()
}
class Animal{
var type: String = "mammal"
}
// 如果一個類有繼承的類,則父類必須放在前面
class Dog: Animal, Pet{
// 如果protocol沒有init(name)的要求,name有默認名字就夠了
var name: String = "Puppy"
// 如果 protocol 有 init ,則在 class 中必須注明 required
required init(name: String){
self.name = name
}
func playWith() {
print("Wong")
}
func fed(){
print("I love bones")
}
}
final class Cat: Animal, Pet{
var name: String = "Kitten"
// 如果是final class, init 可以沒有 required , 因為也不會再被繼承了
init(name: String){
self.name = name
}
func playWith() {
print("Meow")
}
func fed(){
print("I love fish")
}
}
class Bird: Animal{
var name: String = "Little Little Bird"
init(name: String){
self.name = name
}
}
// 如果只是繼承 Bird ,Bird 的 init 為 required ,則 override 可以省略
// 否則,必須有 override , 可以沒有 required
// 因為有 Pet ,則 required 也不能省
class Parrot: Bird, Pet{
required override init(name: String){
super.init( name: name + " " + name )
}
func playWith() {
print("Hello")
}
func fed(){
print("Thank you!")
}
}
```
- 學習筆記
- 基礎
- 基本類型之整型
- 基本類型之浮點型
- 基本類型之布爾類型以及簡單的 if 語句
- 基礎類型之元組
- 基本類型之其他
- 運算符
- 基礎運算符
- 比較運算符、邏輯運算符
- 三元運算符
- 范圍運算符for-in
- 邏輯控制
- 循環結構
- 選擇結構
- 字符串
- Character和Unicode
- String.index 和 range
- 可選型
- 容器類
- 數組初始化
- 數組基本操作
- 字典初始化
- 字典基本操作
- 集合初始化
- 集合基本操作
- 函數
- 閉包
- 枚舉
- 結構體
- 類
- 文檔注釋
- 屬性和方法
- 下標和運算符重載
- 拓展和泛型
- 協議
- 其他
- Swift 3.0 For 循環
- Swift 隨機數的生成
- IOS開發玩轉界面 UIKit
- UILable 文本顯示控件
- UIButton 簡單的交互控件
- UIImageView 圖片控件
- UISearchBar 搜索控件