2016-09-14 7 views
1

名前付き変数の型をチェックする方法を知っています - if var is T。しかし、ジェネリック関数の戻り値の型をチェックする方法を見つけることができません。Swift:ジェネリック関数の戻り値の型を確認してください。

ライブたとえば、SwiftyJSONを扱う、醜いソリューション:

func getValue<T>(key: String) -> T? { 
    let result: T // so ugly approach... 
    if result is Bool { 
     return json[key].bool as? T 
    } 
    if result is Int { 
     return json[key].int as? T 
    } 
    if result is String { 
     return json[key].string as? T 
    } 
    fatalError("unsupported type \(result.dynamicType)") 
} 

よりエレガントなアプローチを探しています。

答えて

2

これは動作します:

func getValue<T>(key: String) -> T? { 
    if T.self is Bool.Type { 
     return json[key].bool as? T 
    } 
    if T.self is Int.Type { 
     return json[key].int as? T 
    } 
    if T.self is String.Type { 
     return json[key].string as? T 
    } 
    fatalError("unsupported type \(T.self)") 
} 

しかし、私はそれはあなたより任意のよりエレガントだか分かりません。これにより

func getValue(key: String) -> Bool? { 
    return json[key].bool 
} 
func getValue(key: String) -> Int? { 
    return json[key].int 
} 
func getValue(key: String) -> String? { 
    return json[key].string 
} 

、あなたではなく、実行時に致命的なエラーを取得するよりも、コンパイル時にエラーを見つけることができます:


オーバーロードは試してみる価値なものです。

+0

「T.self」に感謝します!専門分野に関しては、コードに共通のロジックがあるため、関数を複製したくないと思います。私はプロトコル拡張でそれを解決しました: '' – brigadir

関連する問題