import Foundation
protocol Pet {
var name: String {get set} // 继承他的时候不一定非要是计算型属性
let birthPlace: String {get} // 只读
func playWith()
func fed(food: String)
}
struct Dog: Pet {
var name: String = "Puppy" // 这里不能写let,因为协议中规定是可读可写,你这里相当于不遵守协议了
var birthPlace = "Wuhan" // 协议里面是let,这里是var,相当于是在可读的基础上我加了一个可写
func playWith() {
print("Happy!")
}
func fed(food: String = "bone") {
print("I love eating \(food)!")
}
mutating func changeName(newName: String) {
name = newName
}
}
var myDog: Dog = Dog()
var aPet: Pet = myDog // 这里和继承那一章很像,Pet类型的aPet可以存放其子类的对象
myDog.birthPlace = "Hankou" // 不报错,因为Dog结构体中是可读可写的
aPet.birthPlace = "Wuchang" // 报错,因为Pet协议中是只读的
2. 协议和构造函数
import Foundation
protocol Pet {
var name: String {get set} // 继承他的时候不一定非要是计算型属性
var birthPlace: String {get} // 只读
func playWith()
func fed(food: String)
init(name: String) // 协议也可以有构造函数
}
class Animal {
var type: String = "mammal"
}
class Dog: Animal, Pet {
var name: String = "Puppy" // 这里不能写let,因为协议中规定是可读可写,你这里相当于不遵守协议了
var birthPlace = "Wuhan" // 协议里面是let,这里是var,相当于是在可读的基础上我加了一个可写
required init(name: String) { // 子类也必须继承
self.name = name
}
func playWith() {
print("Happy!")
}
func fed(food: String = "bone") {
print("I love eating \(food)!")
}
func changeName(newName: String) {
name = newName
}
}
class Bird: Animal {
var name: String = "Little bird"
init(name: String) {
self.name = name
}
}
class Parrot: Bird, Pet {
required override init(name: String) { // 这里的required是协议必须遵守的,要加required,要加override是因为构造函数和父类一样,所以要加override关键字
super.init(name: name + " " + name)
}
func playWith() {
print("gugugu")
}
func fed(food: String) {
print("Thanks~")
}
let birthPlace: String = "Wuhan" // 这里没有name,是因为虽然Pet中规定了必须要有name,但是Parrot的父类已经有name了所以不需要
}
3. 举个?
import UIKit
protocol Pet {
var name: String {get set}
}
protocol Flyable {
var flySpeed: Double {get}
var flyHeight: Double {get}
}
class Animal {
}
class Dog: Animal, Pet {
var name = "puppy"
}
class Cat: Animal, Pet {
var name = "Kitten"
}
class Bird: Animal, Flyable {
var flySpeed: Double
var flyHeight: Double
init(flySpeed: Double, flyHeight: Double) {
self.flySpeed = flySpeed
self.flyHeight = flyHeight
}
}
class Parrot: Bird, Pet {
var name: String
init(name: String, flySpeed: Double, flyHeight: Double) {
self.name = name + " " + name
super.init(flySpeed: flySpeed, flyHeight: flyHeight) // 子类指定的构造函数一定要用init
}
}
class Sparrow: Bird {
var color = UIColor.gray
}
class Vehicle {
}
class Plane: Vehicle, Flyable {
var flySpeed: Double