ジェネリックタイプがプロトコルに準拠しているかどうかを確認したいと思います。そうであれば、型自体をキャストし、それに対して静的メソッドを呼び出す必要があります。Swiftのタイプキャスト3
func log<T>(object: T) {
if let C = T as? Loggable { // this line doesn't compile
print("\(C.description(of: object))")
} else {
print("\(object)")
}
}
誰でも知っているのですか?
UPDATE
私は私の最初のコードスニペットであなたを混同しました。うまくいけば、秒はより意味をなさない。私は@ portellaの答えのおかげでいくつかの変更を加えましたが、まだ十分ではありません。あなたが関数に送信されたすべてのオブジェクトが私にとっては、私はこれが好きではないLoggable
プロトコルに準拠していることを確認し
protocol Loggable {
func log()
static func staticLog()
}
func log<L: Loggable>(object: L) {
object.log()
L.staticLog()
}
、しかし:
func decodeObject<T>() -> T? {
guard let object = objects.first else {
return nil
}
objects.removeFirst()
if object is NSNull {
return nil
}
if T.self is Coding.Type { // the condition is fixed, thanks to @Hiron
if let data = object as? Data {
return type(of: (T.self as! Coding)).from(data: data) as? T
} else {
return nil
}
}
return object as? T
}
はなぜちょうど 'log'の2つのオーバーロードを持っていない(@Hironで述べた種類のチェックを使用しています) ? 1つは 'Loggable'の' T'で、もう1つは 'T'です。 – Hamish
@Hamishこれはオプションかもしれません。答えが見つからない場合は、この方法で実装します。ありがとう –
私は何とか[この回答](http://stackoverflow.com/questions/41236021/how-do-i-check-if-an-object-is-a-collection-swift/41237381#41237381)は、あなたは何をしようとしているのかに役立ちます。 –