Lý do nó hoạt động với nhiều loại đơn giản là bởi vì có một phiên bản của ==
được định nghĩa cho optionals có chứa loại mà là Equatable
:
func ==<T : Equatable>(lhs: T?, rhs: T?) -> Bool
Nhưng trong khi Int
là Equatable
, Array
không (vì nó có thể chứa một cái gì đó mà không phải là tương đương - trong trường hợp đó làm thế nào nó có thể được). Tất cả các điều khoản Equatable
đều có nhà điều hành ==
, nhưng không phải tất cả mọi thứ đều có nhà điều hành ==
là Equatable
.
Bạn có thể viết một phiên bản đặc biệt hợp cụ thể của ==
đặc biệt cho mảng tùy chọn có chứa loại equatable:
func ==<T: Equatable>(lhs: [T]?, rhs: [T]?) -> Bool {
switch (lhs,rhs) {
case (.Some(let lhs), .Some(let rhs)):
return lhs == rhs
case (.None, .None):
return true
default:
return false
}
}
Bạn cũng có thể khái quát này để bao gồm bất kỳ bộ sưu tập có chứa yếu tố equatable:
func ==<C: CollectionType where C.Generator.Element: Equatable>
(lhs: C?, rhs: C?) -> Bool {
switch (lhs,rhs) {
case (.Some(let lhs), .Some(let rhs)):
return lhs == rhs
case (.None, .None):
return true
default:
return false
}
}
Nguồn
2015-04-06 20:13:06
Bạn đang sử dụng phiên bản Swift nào? Trường hợp thứ hai của bạn cung cấp cho tôi lỗi của 'Biến 'y' được sử dụng trước khi được khởi tạo ' – aganders3
trùng lặp có thể có của [Lỗi Swift so sánh hai mảng tùy chọn] (http://stackoverflow.com/questions/28830411/swift-error-comparing- hai mảng-of-optionals) – milo526
Xin lỗi, tôi đã đánh máy từ một sân chơi. Đã sửa câu hỏi. –