我不确定有关元组的官方术语,但是您将它们声明为好像它们是一种特殊类型:
let A : (Int, String)
也许我们可以说 A 现在是元组类型的变量?然而,并不是所有的元组都是一样的。如果您声明元组类型的变量并尝试为其分配一个元组,其参数的计数、序列或类型不同,您将收到编译器错误。这将失败
let A : (Int, String) = ("Bob", 1234, 4.0)
虽然这很好用:
let A : (Int, String) = (1234, "Bob")
当然,这种强类型安全性也可以通过结构来实现。
就优势而言,这里是我所知道的差异的一些想法。
结构要求您在使用它们之前对其进行定义。另一方面,元组允许您返回任意值列表。这有什么用?我有一个 iPad 应用程序,里面有一个购物车视图控制器。购物车视图中有一个摘要视图,可显示任何给定时间购物车中物品的当前状态 - 有时只是普通物品,但 RMA 物品和重新订购的物品也可能在购物车中。我的购物车类有一个方法,它返回一个包含购物车计数、RMA 计数、重新订购计数和总计数的元组。我不必声明一个结构来取回所有四个值。很方便:
class Cart : NSManagedObject {
...
var totals : (cartCount:Int, rmaCount:Int, reorderedCount:Int, totalCount:Int) {
let cart = ... // Calculate cart count
let rma = ... // Calculate rma count
let reorder = ... // Calculate reorder count
let total = cart + rma + reorder // Add them all up
return (cart, rma, reorder, total)
}
}
在我的购物车视图中:
let cartValues = cart.totals
self.summaryView.cartCountLabel.text = "\(cartValues.cartCount)"
self.summaryView.rmaCountLabel.text = "\(cartValues.rmaCount)"
self.summaryView.reorderCountLabel.text = "\(cartValues.reorderedCount)"
self.summaryView.totalCountLabel.text = "\(cartValues.totalCount)"
可能还有其他原因,但对我来说,在这种情况下更喜欢元组是最有说服力的原因。