dat*_*Woo 4 oop design-patterns tuples object-oriented-analysis swift
大约 4 个月前,我用 Swift 启动了一个新的 iOS 项目,只是为了学习这门语言。当我开发它时,我发现自己几乎从未在整个程序中使用元组。这是因为我真的习惯了没有元组的Java和Objective-C。
我听说过一些关于元组的伟大事情,Apple 似乎对将它们添加到 Swift 中感到非常兴奋,但似乎我很难为它们找到真正有用的案例。
到目前为止,我理解并使用它们是为了一件事:快速类替换器。不要仅仅为了将一些属性保留在一起而创建一个新类,而是使用元组。但即便如此,我也只使用了一次元组,因为很多时候这些属性会相互影响,所以那些改变这些属性的方法最好包含在具有这些属性的类中。那么这真的是一个优势吗?
但是,元组新手应该了解 OOP(或 Swift)中使用的其他一些真正有用的设计模式吗?
谢谢!
标准库中的几个示例可能会有所帮助。
\n\n一种常见的需求是从函数中不仅返回一个值,而且返回两个不同的值。例如,在_IntegerArithmeticType协议中,有:
static func addWithOverflow(lhs: Self, _ rhs: Self) -> (Self, overflow: Bool)\nRun Code Online (Sandbox Code Playgroud)\n\n也就是说,它返回新值,加上一个指示是否存在溢出的布尔指示符:
\n\nlet i: UInt8 = 0xFF\nlet (j, overflow) = UInt8.addWithOverflow(i, 1)\nif overflow { println("Oh noes!") }\nRun Code Online (Sandbox Code Playgroud)\n\n如果没有元组,您将不得不求助于inout一个结果,或者返回另一个结构。
该Dictionary集合为其元素保留两种类型:键和值。它们通常捆绑在一起,因此Dictionary定义一个类型,Element作为两者的元组:
struct Dictionary<Key : Hashable, Value> : CollectionType, DictionaryLiteralConvertible {\n typealias Element = (Key, Value)\n}\nRun Code Online (Sandbox Code Playgroud)\n\n然后,当您迭代字典时,您得到的每个元素都是这一对,并且元组的内置解构允许您方便地将它们分成两个:
\n\n// either treat them as a pair:\nfor element in myDictionary { }\n\n// or destructure them:\nfor (k, v) in myDictionary { }\nRun Code Online (Sandbox Code Playgroud)\n\n现在,从理论上讲,这两个例子都可以通过定义新的结构来完成。例如,对于溢出情况:
\n\nstruct ResultWithOverflow<T: _IntegerArithmeticType> {\n let value: T\n let overflow: Bool\n}\n\nstatic func addWithOverflow(lhs: Self, _ rhs: Self) -> ResultWithOverflow<Self>\nRun Code Online (Sandbox Code Playgroud)\n\n然而,重要的是要理解这里,元组不仅仅被使用,因为必须定义这个额外的结构是很痛苦的(即使这是事实)。\xe2\x80\x99s 更多,因为这个额外的结构很混乱 \xe2\x80\x93 它妨碍了读取函数。如果你想知道addWithOverflow做了什么,你\xe2\x80\x99d必须去查找什么ResultWithOverflow。相反,使用元组,它\xe2\x80\x99 在函数定义处非常清楚返回的内容。
同样,如果DictionaryElement字典中存在一个结构作为其元素,那么这也会增加复杂性,可能会妨碍理解字典的工作原理。
显然,这是一种权衡,如果您到处使用元组而不是定义正确的结构,那么您\xe2\x80\x99就会走得太远,并使您的代码不可读。但在使用一次性且轻量级的情况下,它们\xe2\x80\x99 既更易于编写,也更易于阅读。
\n| 归档时间: |
|
| 查看次数: |
297 次 |
| 最近记录: |