Diciamo che ho classe generica Bus:Controllare se ANYOBJECT è di tipo generico in Swift
class Bus<T> {
func doSomething() {}
}
e posso creare un'istanza di esso:
var myBus = Bus<String>()
Ora ho una funzione che prende un parametro del AnyObject
e verifica il suo tipo:
Il mio problema è che non riesco a vedere un modo per verificare se object
è di tipo Bus
ed eseguire la funzione doSomething()
se è di tipo Bus
. Qualsiasi aiuto sarebbe apprezzato.
Edit: protocolli, inoltre, non sembrano risolvere questo il modo in cui dovrebbero.
import Foundation
@objc protocol BusProtocol {
func doSomething() -> Void
}
class Bus<T> : BusProtocol {
func doSomething() -> Void {
println("asdf")
}
}
func checkType(object: AnyObject) {
if let foo = object as? Bus<AnyObject> {
foo.doSomething() // no match
}
if let foo = object as? Bus<Any> {
foo.doSomething() // no match
}
if let foo = object as? Bus<String> {
foo.doSomething() // prints "asdf"
}
if let foo = object as? BusProtocol {
foo.doSomething() // SIGABRT -- -[SwiftObject doesNotRecognizeSelector:]
}
}
checkType(Bus<String>())
L'esempio di modifica che utilizza '@ objc' non sembra segfault con Swift 1.2 - ma ti dà un errore (che era presumibilmente il problema precedente, gestito con meno garbo) che i metodi nelle classi generiche non possono essere' @ objc' (perché Objective-C non supporta i generici). Tuttavia, se si rilascia il qualificatore '@ objc' sul protocollo, funziona come sperato (di nuovo, usando Swift 1.2, che ha introdotto più funzionalità attorno ai protocolli e' as') –