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!")
    }
}
Copyright © http://blog.webfsd.com 2017 all right reserved,powered by Gitbook该文件修订时间: 2018-01-02 01:37:26

results matching ""

    No results matching ""