Câu hỏi này của một "thảo luận" tự nhiên hơn một chút, nhưng Tôi sẽ thêm hai điểm có lợi cho đôi khi thích tuples hơn cấu trúc.
phù hợp Equatable Native cho các bộ kích thước hạn chế
Trong Swift 2.2, tuples lên đến kích thước 6 sẽ natively equatable, cho rằng đó là thành viên là equatable
Điều này có nghĩa là bộ đôi đôi khi sẽ là lựa chọn tự nhiên qua việc sử dụng các cấu trúc nhỏ hơn trong phạm vi giới hạn.
Ví dụ: xem xét ví dụ sau đây, sử dụng (1)
: một cấu trúc
struct Foo {
var a : Int = 1
var b : Double = 2.0
var c : String = "3"
}
var a = Foo()
var b = Foo()
// a == b // error, Foo not Equatable
/* we can naturally fix this by conforming Foo to Equatable,
but this needs a custom fix and is not as versatile as just
using a tuple instead. For some situations, the latter will
suffice, and is to prefer. */
func == (lhs: Foo, rhs: Foo) -> Bool {
return lhs.a == rhs.a && lhs.b == rhs.b && lhs.c == rhs.c
}
và (2)
: một tuple
/* This will be native in Swift 2.2 */
@warn_unused_result
public func == <A: Equatable, B: Equatable, C: Equatable>(lhs: (A,B,C), rhs: (A,B,C)) -> Bool {
return lhs.0 == rhs.0 && lhs.1 == rhs.1 && lhs.2 == rhs.2
}
/* end of native part ... */
var aa = (1, 2.0, "3")
var bb = (1, 2.0, "3")
aa == bb // true
aa.0 = 2
aa == bb // false
Generic quyền truy cập vào các bộ gõ khác nhau: linh hoạt hơn so với cấu trúc kiểu khác nhau
Từ phía trên (so sánh các chức năng ==
), nó cũng là appare nt rằng các bộ dữ liệu có thể dễ dàng làm việc trong ngữ cảnh của các generics, vì chúng ta có thể truy cập các thuộc tính thành viên ẩn danh của chúng bằng cách sử dụng các hậu tố .0
, .1
...; trong khi đối với một cấu trúc, cách dễ nhất để bắt chước hành vi này nhanh chóng trở nên khá phức tạp, các công cụ cần thiết như sự quan sát thời gian chạy và như vậy, xem e.g. this.
Tôi tự nhủ rằng các bộ dữ liệu chỉ hữu ích cho các cấu trúc dữ liệu chỉ được sử dụng cục bộ; nếu không thì tốt hơn là nên có tất cả các cấu trúc dữ liệu được định nghĩa đúng và "được gắn nhãn" làm cấu trúc hoặc các lớp, thay vì để chúng "trôi nổi xung quanh thành các bộ ẩn danh". Nhưng tôi không chắc mình sẽ không sai ... – George
Tôi nghĩ rằng khía cạnh đơn giản là những gì nó là tất cả về :) Không cần phải xác định một cấu trúc, ít mã, nhanh chóng. Swift có nhiều tính năng phục vụ mục đích đơn giản. –