Допустим, что у меня есть общий класс Bus:Проверьте AnyObject имеет общего типа в Swift
class Bus<T> {
func doSomething() {}
}
и я могу создать экземпляр этого:
var myBus = Bus<String>()
Теперь у меня есть функция который принимает один параметр AnyObject
и испытывает его тип:
func checkType(object: AnyObject) {
if let foo = object as? String {
println("string")
}
}
Моя проблема заключается в том, что я не вижу способа проверить, имеет ли object
тип Bus
и выполняет функцию doSomething()
, если он имеет тип Bus
. Любая помощь будет оценена по достоинству.
Edit: протоколы также не кажется, решить эту, как они должны.
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>())
Ваш пример редактирования с использованием '@ objc' не отображается в Segfault с помощью Swift 1.2 - но он дает вам ошибку (которая, предположительно, была проблема до этого, обрабатывается менее изящно), что методы в родовых классах не могут быть' @ objc' (потому что Objective-C не поддерживает дженерики). Однако, если вы отбросите классификатор '@ objc' в протоколе, он будет работать так же надежен (опять же, используя Swift 1.2, в котором появилось больше возможностей вокруг протоколов и' as') –