Swift   发布时间:2022-04-30  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了swift – 扩展协议以实现不同的行为大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
快速的问题,比如说你有一个协议Bark:

protocol MakeSound {
   func bark()
}

超级狗,实现树皮和游泳:

class Dog: MakeSound {
}

然后不同类型的狗延伸:

class Poodle: Dog {
}

class GeRMANShephard: Dog {
}

class SheepDog: Dog {
}

但是poodles yap,他们不会吠叫……所有的狗都吠叫,他们只是采取不同的方式……我如何给他们特定的树皮行为?

扩展协议?…

extension MakeSound {
    func bark()
    func yapper()
}

但是Poodles和德国Shephards都有这两种行为(一个叫做德国谢泼德?)

如果我进行2次扩展并使用Self =检查类型类?

extension MakeSound where Self: GeRMANShephard {
    func bark() {
        print("Bark")
    }
}

extension MakeSound where Self: Poodle{
    func yapper() {
        print("yap yap")
    }
}

但我只能检查一种类型或狗类型. SheepDogs也叫,但我不能在这里检查……

我知道在Java中,您可以扩展具有多个不同实现的接口.你如何使用协议在Swift中使用协议来解决这个问题呢?

解决方法

如果我理解你的问题,也许这很有帮助.

你可以通过扩展协议给bark()一个认的实现.然后在符合协议的其他类上,您可以更改bark函数的实现:

protocol Bark {
   func bark()
}

//default implementation
extension Bark {
      func bark() { print("Bark") }
}

class Dog: Bark {}

//By calling bark func in Poodle,you change the default implementation.
class Poodle: Dog {
   func bark() { print("Yap") }
}

class GeRMANShephard: Dog {
     func bark() { print("Woof") }
}

let dog = Dog()
let poodle = Poodle()
let geRMANShephard = GeRMANShephard()

dog.bark()
//Bark
poodle.bark()
//Yap
geRMANShephard.bark()
//Woof

您也不能执行任何认实现,只需为每种情况添加自己的实现

评论后编辑:

这是协议有用的主要原因之一.它们消除了与子类化有关的紧耦合.这是一个基本的例子,因为整个主题是很多信息,但不是子类化Dog,你可以制作一个协议DogRepresentable并分配所有狗实现相同的所有属性功能.然后你可以在其中扩展DogRepresentable:UIViewController并实现功能

protocol Barkable {
    func bark()
}

protocol DogRepresentable: Barkable {
//properties and functions all dogs will have with same implementation
}

extension DogRepresentable where Self: UIViewController {
//default implementation for functions all dogs will use
}

通过将Barkable分配给DogRepresentable,您知道任何符合DogRepresentable的类也必须符合Barkable.

现在,当您将DogRepresentable分配给一个类时,它将获得基类将获得的所有认实现,并且您被迫调用bark()函数以正确地符合协议:

class Dog: DogRepresentable {
   func bark() { print("Bark") }
} 

class Poodle: DogRepresentable {
   func bark() { print("Yap") }
}

 class GeRMANShephard: DogRepresentable {
    //Won't conform because it doesn't have bark()
}

这样你就可以获得像基类一样的所有认实现,但是不会忘记覆盖超类函数.

根据第二条评论编辑2:

在这种情况下,你最好的选择是离开DogRepresentable而不遵守Barkable,然后为不同类型创建协议:所以如果你有狗,你可以做一个具有树皮功能认实现的协议Yappable.然后你可以拥有另一个Barkable协议,它有自己的bark函数和它自己的认实现.然后让类符合他们应该遵循的协议. Poodle符合Yappable,Dog符合Barkable.

通过创建这些单独的协议,您可以将每种情况的功能保留在一个位置,并且只使用您需要的任何一个,从而使代码更清晰,更易读和干燥.

大佬总结

以上是大佬教程为你收集整理的swift – 扩展协议以实现不同的行为全部内容,希望文章能够帮你解决swift – 扩展协议以实现不同的行为所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。