2015-01-08 5 views
16

Я ищу, чтобы сделать что-то вроде следующего, но когда я пытаюсь увидеть, если b == Test.self, я получаю сообщение об ошибке «Любой класс не конвертируется в MirrorDisposition». Как я могу проверить, соответствует ли тип другому типу?Сравнение типов с Swift

class Test { 

} 

var a = Test.self 

var b : AnyClass = a 

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

ответ

26

Используйте «идентичный» оператор ===:

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

Это работает, потому что тип класса, то он сам объект класса и поэтому могут быть по сравнению с ===.

Он не будет работать с struct. Возможно, у кого-то есть лучший ответ, который работает для всех типов Swift.

+0

TIL о новом оператора: D Спасибо. – puttputt

+1

Почему его нельзя сравнивать между 'Any? 'И' Any? '? У меня была ошибка: 'Двоичный оператор === не может быть применен к двум Любые? operands' – Kuba

+0

@Kuba: Оператор '===' определен только для экземпляров класса *. * –

5

Если вы просто хотите, чтобы сравнить типы классов, то вы можете просто использовать NSStringFromClass сравнить имена классов, как показано ниже:

class Test {} 

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

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

Если вы хотите узнать или сравнить тип объекта, вы можно использовать «если ... это ... {}» синтаксис как код ниже:

class Test { } 
class Testb { } 

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

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

Если вы хотите сделать объект объекта проверки равенства с помощью оператора ==, вы можете сделать свой класс Test соответствует Equatable протокол. Это можно расширить до типа Struct и Class в Swift, как описано в этой статье NSHipster: http://nshipster.com/swift-comparison-protocols/.

Вы можете записать код, как показано ниже, обратите внимание: это проверка равенства объектов, поэтому вы не можете определить b как AnyClass, вам нужно определить как 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") 
} 

попробовать :)

+0

спасибо - это помогло мне решить некоторые особенно болезненные ошибки EXC_BAD_ACCESS, потому что оператор IS возвращал ложные срабатывания. –

+0

@Matt Bolt Oh. Cool :) –

+2

по какой-то причине оператор === («идентичный») не работал при проверке UIAlertController, в то время как .isKindOfClass работал хорошо – Vitalii

Смежные вопросы