2016-01-13 23 views
9

Tôi có một vài loại giá trị "Bất kỳ" mà tôi muốn so sánh.Cách so sánh các loại giá trị "Bất kỳ"

var any1: Any = 1 
var any2: Any = 1 

var any3: Any = "test" 
var any4: Any = "test" 

print(any1 == any2) 
print(any2 == any3) 
print(any3 == any4) 

Sử dụng toán tử == thấy một lỗi:

"Binary operator '==' cannot be applied to two 'Any' (aka 'protocol<>') operands"

Điều gì sẽ là cách để làm điều này?

+5

Làm thế nào bạn có thể so sánh những điều bạn không biết gì về? Tại sao bạn lại tạo ra chúng "Bất kỳ"? – Wain

+1

Im chỉ thử nghiệm khả năng nhanh chóng. –

+1

@theReverend '===' so sánh các tham chiếu, vì vậy nó chỉ có thể được áp dụng cho các kiểu tham chiếu - tất cả chúng đều phù hợp với 'AnyObject' –

Trả lời

13

Cách duy nhất để làm điều này là với một chức năng khác ngoài == mà phải mất một tham số kiểu, và sau đó so sánh giá trị nếu họ là cả hai kiểu đó:

func isEqual<T: Equatable>(type: T.Type, a: Any, b: Any) -> Bool? { 
    guard let a = a as? T, let b = b as? T else { return nil } 

    return a == b 
} 

Bây giờ, sử dụng các biến của bạn ở trên, bạn có thể so sánh chúng như thế này:

var any1: Any = 1 
var any2: Any = 1 

var any3: Any = "test" 
var any4: Any = "test" 

isEqual(Int.self, a: any1, b: any2)  // true 
isEqual(Int.self, a: any2, b: any3)  // nil 
isEqual(String.self, a: any3, b: any4) // true 
3

Để sử dụng toán tử ==, loại phải tuân theo giao thức Equatable. Giao thức Any không tuân theo giao thức Equatable, vì vậy không có cách nào so sánh hai giá trị Any. Nó hợp lý - Any là thuật ngữ quá rộng - các giá trị có thể không có 'mẫu số chung'.

Còn gì nữa, Swift không cho phép so sánh hai giá trị Equatable có loại khác nhau. Ví dụ. cả hai số IntString đều tuân thủ Equatable nhưng 1 == "1" không biên dịch. Lý do cho điều đó là tuyên bố của == trong giao thức Equatable: func ==(lhs: Self, rhs: Self) -> Bool. Điều này về cơ bản Tự có nghĩa là cả hai đối số phải có cùng loại. Đó là loại trình giữ chỗ - khi triển khai cho loại cụ thể, nên thay thế Self bằng tên loại này.

Các vấn đề liên quan