2015-01-08 27 views
16

Tôi đang tìm cách làm điều gì đó như sau, nhưng khi tôi cố gắng xem liệu b == Test.self tôi nhận được lỗi "Bất kỳ lớp nào không chuyển đổi thành MirrorDisposition". Làm thế nào tôi có thể kiểm tra xem một Loại có bằng loại khác không?So sánh các loại với Swift

class Test { 

} 

var a = Test.self 

var b : AnyClass = a 

if(b == Test.self) { 
    println("yes") 
} 
else { 
    println("no") 
} 

Trả lời

26

Sử dụng "giống với" hành ===:

if b === Test.self { 
    print("yes") 
} 
else { 
    print("no") 
} 

này hoạt động vì các loại của một lớp nó chính nó là một đối tượng lớp và do đó có thể được so sánh với ===.

Nó sẽ không hoạt động với struct s. Có lẽ ai đó có một câu trả lời tốt hơn hoạt động cho tất cả các loại Swift là .

+0

TIL về một mới khai thác: D Cảm ơn. – puttputt

+1

Tại sao nó không thể được so sánh giữa 'Bất kỳ?' Và 'Bất kỳ? '? Tôi đã có lỗi: 'Toán tử nhị phân === không thể áp dụng cho hai Không? operands' – Kuba

+0

@Kuba: Toán tử '===' chỉ được định nghĩa cho các trường hợp của một lớp *. * –

5

Nếu bạn chỉ muốn so sánh các loại lớp học, sau đó bạn có thể chỉ cần sử dụng NSStringFromClass để so sánh tên lớp như sau:

class Test {} 

var a = Test.self 
var b : AnyClass = a 

if(NSStringFromClass(b) == NSStringFromClass(Test.self)) { 
    println("yes") 
} else { 
    println("no") 
} 

Nếu bạn muốn tìm hiểu hoặc so sánh kiểu của một đối tượng, bạn có thể sử dụng "nếu ... là ... {}" cú pháp như mã bên dưới:

class Test { } 
class Testb { } 

var a = Test.self 
let b : AnyObject = Testb() 

if(b is Test) { 
    println("yes") 
} else { 
    println("no") 
} 

Nếu bạn muốn làm đối tượng để đối tượng kiểm tra bình đẳng với toán tử ==, bạn có thể làm cho class Test của bạn phù hợp với Equatable giao thức. Điều này có thể được mở rộng cho cả hai loại Struct và Class trong Swift như được giải thích trong bài viết NSHipster này: http://nshipster.com/swift-comparison-protocols/.

Bạn mã sau đó có thể được viết như dưới đây, xin lưu ý: đây là đối tượng kiểm tra bình đẳng, vì vậy bạn không thể xác định b là AnyClass, bạn cần thay vì xác định là AnyObject.

class Test: Equatable { } 

// MARK: Equatable 
func ==(lhs: Test, rhs: Test) -> Bool { 
    return ObjectIdentifier(lhs) == ObjectIdentifier(rhs) 
} 

var a = Test() 
var b : AnyObject = a 

if((b as Test) == a) { 
    println("yes") 
} else { 
    println("no") 
} 
15
if b.isKindOfClass(Test) { 
    println("yes") 
} else { 
    println("no") 
} 

Edit: Swift 3

if b.isKind(of: Test.self) { 
    print("yes") 
} else { 
    print("no") 
} 

thử nó :)

+0

cảm ơn - điều này đã giúp tôi giải quyết một số lỗi EXC_BAD_ACCESS đặc biệt đau đớn vì toán tử IS trả về kết quả dương tính giả. –

+0

@Matt Bolt Oh. Cool :) –

+2

vì lý do nào đó toán tử === ("giống hệt") không hoạt động khi kiểm tra UIAlertController trong khi .isKindOfClass hoạt động tốt – Vitalii

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