Я хочу использовать переключатель в расширении - PullRequest
0 голосов
/ 17 сентября 2018
protocol Sound { func makeSound() }

extension Sound {  
   func makeSound() { 
     print("Wow") 
   } 
}

protocol Flyable {
   func fly()
}

extension Flyable { 
    func fly() {
        print("✈️") 
    }
}

class Airplane: Flyable { }

class Pigeon: Sound, Flyable { }

class Penguin: Sound { }

let pigeon = Pigeon()
pigeon.fly()  // prints ✈️
pigeon.makeSound() // prints Wow

приведенный выше код работает нормально, но мне нужно напечатать различные типы звука (IE).если я вызываю plane.fly (), он должен напечатать меня («что-то другое»).и то же самое для пингвина

1 Ответ

0 голосов
/ 17 сентября 2018

Укажите fly() для класса Самолет:

class Airplane: Flyable {
    func fly() {
        print("something different")
    }
}

let airBus: Airplane = Airplane()
airBus.fly()
//prints "something different"

Вы можете сделать то же самое для класса Пингвин:

class Penguin: Sound {
    func makeSound() {
        print("squawk")
    }
}

let ? = Penguin()
?.makeSound()
//prints "squawk"

Предоставляемые вами функции: реализации по умолчанию протокола. Если тип не переопределяет функцию, он примет реализацию по умолчанию. Вы можете найти больше в документах :

Вы можете использовать расширения протокола, чтобы обеспечить реализацию по умолчанию для любого метода или требования вычисляемого свойства этого протокола. Если соответствующий тип обеспечивает собственную реализацию требуемого метода или свойства, эта реализация будет использоваться вместо той, которая предусмотрена расширением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...