# 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 搜索控件