gpt4 book ai didi

swift - 封装类是否反射(reflect)了 Swift 3 范例?

转载 作者:可可西里 更新时间:2023-11-01 02:08:41 26 4
gpt4 key购买 nike

场所:

  • 理想情况下,一种语言中的程序应尝试匹配该语言所归属的范例的方式。
  • 在 Swift 中,这些范例主要是面向协议(protocol)的编程,其次是函数式编程。
  • 出于兼容性和互操作性的原因,Swift 还支持面向对象的编程。
  • 引用类型(类)是 OOP 惯用的,而值类型(结构、枚举、基元)与协议(protocol)结合使用是 POP 惯用的。

结论:只要有可能,就应该使用值类型和协议(protocol),只有在完全必要时才恢复到类。

提问:那么,包含值类型的类的作用是什么?这些封装类是否符合 Swift 范式,或者它们是 OOP 的遗留物?

基本案例:Swift 中的以下做法是好是坏:

struct Attribute {
let name: String
var value: Int
}

final class AttributeManager {
var attributes: [Attribute] = []
func add(attribute: Attribute) { self.attributes.append(attribute) }
}

最佳答案

您陈述的某些前提是错误的。

Swift 是多范式通用语言。它没有 OOP 只是因为兼容性和互操作性。多范式语言允许开发人员为特定工作选择最合适的编码范式。

此外,一些概念与单一范式并不严格相关。值类型不仅仅是功能性的,它们构成了结构语言中的基本类型。许多非函数式 OOP 语言也支持超出基本原始值类型的值类型。

所谓的面向协议(protocol)编程只是基于接口(interface)编程的另一种形式和扩展——面向对象编程的核心概念之一。

关于将值类型包装到类中是好是坏的问题无法回答,因为这取决于您将如何使用该类。

类和结构的行为略有不同。有时这种差异无关紧要,因此您可以在它们之间自由选择,有时确实如此,您将不得不使用适合您需要的那个。

在您的代码示例中,将 AttributeManager 定义为类而不是结构的主要区别是共享对其 attributes 字段的更改。如果您处理类实例,您可以将其作为参数传递,并且您可以跨代码对 attributes 字段进行更改并保留更改。使用值类型变量执行此操作更加复杂,并且需要使用 in-out 参数或通过函数返回值返回更改的结构。类在这里提供了更多的灵 active 。此外,使用结构与单例模式相矛盾,在单例模式中,您需要有一个且只有一个实例可以改变其状态。

每个编程范式和相关概念都提供了特定问题的解决方案,但它们也引入了一些其他问题。当您选择一种编码范式而不是另一种时,您应该根据您要解决的问题来选择它。

进一步阅读:Swift Is Not Functional

关于swift - 封装类是否反射(reflect)了 Swift 3 范例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41787523/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com