为什么 Swift 中的协议比类更好? [关闭]

2024-01-12

通过观看Apple提供的视频教程,似乎swift是面向协议的编程语言,并且Apple鼓励程序员使用协议而不是类。 但从我个人的角度来看,我认为协议没有明显的优势。类可以符合协议,但也可以从超类继承。我们可以向协议添加扩展,但我们也可以向类添加扩展。我们可以在符合协议的类中实现函数,但我们也可以在子类中重写 func 。 我仍然很困惑为什么我们需要使用协议而不是类。什么时候我们应该使用协议而不是类?


类和协议是正交的概念。协议跨越类树并将具有不同祖先的一个或多个类连接起来。

也许更简单地说:

  • “类”定义了对象是什么。
  • “协议”定义了对象具有的行为。

所以你有一个类 Car:

class Car {
    var bodyStyle : String
}

和一类颜色:

class Color {
    var red : Int
    var green : Int
    var blue : Int
}

现在,或多或少明显颜色和汽车完全无关,但是,假设我希望能够轻松地将其中任何一个转换为字符串,这样我就可以使用以下命令进行调试:

print(Car(...))

or

print(Color(...))

正是为了这个目的,Swift 语言定义了协议CustomStringConvertible所以我们可以声明可以使用该协议打印 Car:

extension Car : CustomStringConvertible {
    var description : String { get { return "Car: \(bodyStyle)" } }
}

还有颜色:

extension Color : CustomStringConvertible {
    var description : String { get { return "Color: \(red) \(green) \(blue)" } }
}

因此,以前我需要为每个类使用一种打印方法,现在我只需要一种打印方法,如下所示:

func print(data:CustomStringConvertible) {
    let string = data.description
    ... bunch of code to actually print the line
}

这是可能的,因为声明一个类实现一个协议是一个承诺,我可以使用协议中的方法,知道它们已实现并且(大概)执行预期的操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Swift 中的协议比类更好? [关闭] 的相关文章

随机推荐

  • Node.js 全局变量

    我在这里问 Node js 需要继承吗 https stackoverflow com questions 5348685 node js require inheritance 有人告诉我 我可以通过省略变量来将变量设置为全局范围 这对我
  • 如何在黑莓中使BrowserField的背景透明

    我在用BrowserField的组成部分RIM BB 它现在显示白色背景 我想要制作一个透明背景 这样它就可以与经理的背景颜色相匹配 我曾尝试使用下面的代码 但这不起作用 BrowserField contentField new Brow
  • 为什么字符串类型的默认值是null而不是空字符串?

    测试我所有的琴弦是很烦人的null在我可以安全地应用像这样的方法之前ToUpper StartWith etc 如果默认值为string如果是空字符串 我就不必测试 而且我觉得它与其他值类型更加一致 例如int or double例如 此外
  • Ansible jenkins_plugin 模块返回“HTTP 错误 403:请求中未包含有效的 crumb”

    我使用 Ansible v 2 8 作为 Packer 模板背后的配置程序来为 Jenkins 主节点构建 AMI 对于以前的版本 剧本已成功通过 然而 从 Jenkins 版本 2 176 3 开始 jenkins plugin模块一直在
  • 为什么spring找不到Spring Cloud Stream创建的@Source bean通道?

    我正在尝试使用 Spring Cloud Stream 来发布和使用 Kafka 消息 我一直在研究文档这里关于访问绑定通道 http docs spring io spring cloud stream docs Chelsea SR2
  • React-dnd getDecolatedComponentInstance() 不是一个函数

    我目前正在 React 中构建文件上传和排序功能 我使用了以下示例 https gaearon github io react dnd examples chessboard tutorial app html https gaearon
  • 根据距离聚合 sf 点

    当点在指定距离内时 我想创建 SpatialPointsDataFrame 的所有变量的平均值 我有一个方法可以做到这一点 但这似乎是解决问题的愚蠢方法 任何使用整洁的现代语法来做到这一点的想法将不胜感激 首先 我有一个SpatialPoi
  • 如何将此 MySQL SELECT 查询转换为 DELETE 查询?

    我想从数据库中删除某些项目 我有以下查询 SELECT FROM sheets entries WHERE entries sheetID sheets id AND sheets clientID 13 这有效 并返回 2 个结果 现在我
  • 如何锁定尚不存在的 InnoDB 行?

    如何保证我可以搜索数据库中是否存在用户名 然后将该用户名作为新行插入数据库中 而在用户名之间没有任何拦截SELECT and INSERT声明 几乎就好像我锁定了不存在的行 我想用用户名锁定不存在的行 Foo 这样我现在就可以检查它是否存在
  • 结对编程、混合 IDE 环境?

    有人有过在混合 IDE 环境中进行结对编程的团队经验吗 我是 IntelliJ 的长期用户 其他人使用 Eclipse 您可能听说过 在我看来 结对编程涉及程序员之间大量传递键盘 但每次我拿到键盘时 我都会停下来 因为我不知道还能做什么 就
  • 使用 HTTP PUT 通过 Jquery 和 Rails 3 发送 JSON

    HTTP PUT 并不完全跨浏览器 因此 Rails 我使用的是 Rails 3 支持使用 POST 并传递 method查询参数这很棒 但是在发送 JSON 时似乎不起作用 Example ajax url window location
  • 如何在 Bokeh (Python) 中绘制水平条形图

    我有这个数据 data Cities Des Moines 80 0 Lubbock 300 0 Minneapolis 85 7 Orange County 80 0 Salt Lake City 81 8 San Diego 80 0
  • Visual Studio 设计器不显示嵌入字体

    我在 Visual Studio 2013 的 C WPF NET 4 0 应用程序 特别是 Open Sans 和 FontAwesome 中使用一些自定义字体 I have 将 FontAwesome otf 和 OpenSans Re
  • 杰克逊 2.0 与球衣 1.12

    有人设法将 Jackson 2 0 与 Jersey 1 12 一起使用吗 知道这一点将会非常有趣 我们必须在所有地方使用 Jackson 1 9 x 只是因为 jersey 与 Jackson 的耦合如此紧密 据我所知 甚至 jersey
  • 我的 App Engine 控制面板中的数据存储区管理页面为空白

    我在 appspot com 上的所有应用程序中的数据存储管理页面都是空白的 我已按照说明启用它们 并且没有收到任何错误消息 只是加载了空白页面 有人可以帮忙吗 如果您使用的是 Google Chrome 并通过多个 Gmail 帐户登录
  • 模拟本地网络的低速连接

    有时我想手动测试我的 Web 应用程序 调用 Web 服务或网站或 RIA 的桌面应用程序 以查看它们在低速互联网连接 例如 56 kbps 下的行为方式 是否可以通过网络模拟比真实速度更低的速度来实现 如果是 是否也可以模拟低质量连接 例
  • 使用苹果的 auriotouch 示例计算频率

    我正在开发一个需要捕获吉他声音频率的程序 我修改了 aurioTouch 示例 以使用幅度最高的频率来输出频率 它适用于高音 但在低音弦上非常不准确 我相信这是由于泛音造成的 我研究了如何解决这个问题的方法 例如倒谱分析 但我不知道如何在示
  • 是否可以在同一个 Django 项目中拥有单独的 SQLite 数据库?

    我正在考虑为 Django 项目上的某些应用程序创建一个单独的 SQLite 数据库 但是 如果可能的话 我不想使用直接 SQLite 访问 对这些数据库的 Django 风格 ORM 访问将是理想的选择 这可能吗 谢谢 是的 低级 API
  • 从 swift 调用 Objective-C typedef 块

    我正在尝试从 swift 调用一个方法 该方法是用 Objective C 编写的单例 头文件中的块 typedef void VPersonResultBlock Person person NSError error void askF
  • 为什么 Swift 中的协议比类更好? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 通过观看Apple提供的视频教程 似乎swift是面向协议的编程语言 并且Apple鼓励程序员使用协议而不是类 但从我个人的角度来看 我认为协议