1

所以我遇到了协议的主题,我在互联网上搜索了很多答案,但我找不到一个,至少一个解决了我的问题。

所以我明白协议是方法、属性等的“蓝图”,它可以在类或结构中实现,并且它需要符合其要求等,但为什么要使用呢?

我的意思是你也可以在结构本身内创建一个函数。编写协议似乎有点麻烦,然后为了实现所述协议,这次您必须使用更多代码再次编写所有需求。

使用协议是否有特殊原因?是为了您的代码安全还是出于其他原因?

例如:

在 swift 中,您拥有 CustomStringConvertible 协议,该协议具有必需的计算属性来控制自定义类型如何表示为可打印的字符串值,但您也可以在类中创建一个函数来解决这个问题。您甚至可以在不实现此协议的情况下拥有与此协议相同的计算属性。

因此,如果有人可以对这个主题有所了解,那就太好了。

先感谢您!

4

3 回答 3

7

但为什么要使用一个呢?

Protocols在 swift 中类似于Abstractions 在其他一些语言中。

在回答你的问题之前,我们必须把事情弄清楚,Protocols声明可能是多种多样的,但考虑到你已经阅读了大量的内容,

在这里提及这个答案也很棒。

现在让我们进入真正的用例。

考虑你有这个协议。

protocol Printable {
var name: String { get }
}

现在我们需要某种类型的structsorclasses来确认它,或者多个

在这里它奠定了它的最大好处之一。

考虑您必须打印name对象的适当性。

例如那些。

struct Human {
    var name: String
}
struct Animal {
    var name: String
}

您只需键入此内容即可Protocols

    func printOut(human: Human){
    human.name
   }

   func printOut(animal: Animal){
    animal.name    
   }

这是正确的,现在使用协议观察下面的代码Printable

struct Human: Printable {
    var name: String
}
struct Animal: Printable {
    var name: String
}

 func printOut(object: Printable){
    print(object.name)
   }

它只需要我们一个func等使用Protocols.

结论

用于最小化不必要的代码块的协议。

它的名字代表了应用在确认方上的效果。

协议可以作为参数类型注入。

您还可以在此处阅读有关它们的更多信息。

更多关于这里的用例。

于 2018-11-18T14:36:28.563 回答
1

swift 中的协议是一种允许您的类确认特定规则集的模式。

换句话说,协议是特定任务所需的方法和属性的蓝图。

您通过确认协议来实施协议。如果你的类错过了协议中定义的任何方法的实现,swift 编译器会告诉你。

作为一个例子,让我们考虑你想要创建一个 Car 类。现在对汽车有特殊要求。就像它有轮子、行李箱等一样。每个需求都可以定义为一个协议,然后由 Car 类实现。如果您的班级没有主干,您只需放弃实现。

面向协议的编程是一种新的编程范式。这解决了面向对象编程带来的一些问题。就像多重继承一样。Swift 不允许多重继承,但它允许对多个协议进行确认。

在面向协议的编程中,从类中删除某些功能非常容易。你只是停止遵守它。与 OOP 相比,它很容易在 POP 中做这些事情。

于 2018-11-18T14:56:04.857 回答
0

协议的概念非常简单:它只不过是一个承诺,即特定方法和/或属性将存在于该协议所采用的任何对象中。因此,我们将它们用于打字和打字安全。

想象一下创建一个自定义控件,如操作表:

class CustomActionSheet: UIControl {

    func userTappedOnSomething() {
        // user tapped on something
    }

}

...并且您在其中一个视图控制器中实现了它。

class SomeViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let actionSheet = CustomActionSheet()
    }

}

当用户点击按钮时,如果不允许操作表与视图控制器通信,这并没有多大用处。所以我们使用一个委托:

class CustomActionSheet: UIControl {

    weak var delegate: UIViewController?

    func userTappedOnSomething() {
        delegate?.userTookAction()
    }

}

class SomeViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let actionSheet = CustomActionSheet()
        actionSheet.delegate = self

    }

    func userTookAction() {
        // update the UI
    }

}

现在,当用户点击操作表中的按钮时,下面的视图控制器可以更新其 UI。但这实际上不会编译。你会得到一个UIViewController没有 member的错误userTookAction。那是因为UIViewController该类没有一个名为 的方法userTookAction,只有视图控制器的这个实例有。所以我们使用一个协议:

protocol ActionSheetProtocol: AnyObject {
    func userTookAction()
}

这个协议说任何符合它的对象都必须包含这个方法。因此,我们将操作表的委托更改为该协议类型,并且我们使视图控制器符合该协议,因为它具有这样的方法:

class CustomActionSheet: UIControl {

    weak var delegate: ActionSheetProtocol?

    func userTappedOnSomething() {
        delegate?.userTookAction()
    }

}

class SomeViewController: UIViewController, ActionSheetProtocol {

    override func viewDidLoad() {
        super.viewDidLoad()

        let actionSheet = CustomActionSheet()
        actionSheet.delegate = self

    }

    func userTookAction() {
        // update the UI
    }

}

这是 Swift 中协议使用的经典示例,一旦你理解了它,你将学会如何巧妙地使用协议并以非常聪明的方式使用它们。但无论你如何使用它们,概念仍然存在:承诺事物将存在。

注意:在这个例子中,我将协议命名为ActionSheetProtocol,因为对于学习协议的人来说,它最有意义。然而,在 Swift 世界中,在今天的实践中,大多数程序员(包括 Apple 的人)都会将其命名为ActionSheetDelegate. 这可能会让学习协议的人感到困惑,所以在这个例子中,我试图让它尽可能清晰。我个人不喜欢命名协议代表,但有很多我不喜欢的东西。

注意 2:我还创建了类型协议,AnyObject这是 Swift 的语法,用于使协议成为类协议。并非所有协议都需要是 type AnyObject

于 2018-11-18T17:18:30.157 回答