2015-09-12 2 views
8

であれば、私は与えられたタイプtAny.Type)は、オプションのタイプであるかどうかを判断しようとしている決定し、私はこのテストにがAny.Typeはオプション

t is Optional<Any>.Type 

を使用していますが、それは常にfalseを返します。

これを達成する方法はありますか?

答えて

7

何をやろうとしているが、このようなものであると仮定すると:

let anyType: Any.Type = Optional<String>.self 
anyType is Optional<Any>.Type // false 

悲しい迅速現在(スイフト2のように)covariance nor contravarianceサポートしておらず、直接Optional.Typeに対して型チェックを行うことができない。

protocol OptionalProtocol {} 

extension Optional : OptionalProtocol {} 

let anyType: Any.Type = Optional<String>.self 
anyType is OptionalProtocol.Type // true 
+0

'OptionalProtocol'はいくつかの素晴らしい使い方を持っています:オプション値にアクセスするための[a * generic-less *インターフェース]を提供するために使用できます。(http:// stackoverflow (32780793#32780793)と[ラップされた型](http://stackoverflow.com/questions/32645612/check)を参照してください。 -if-variable-is-an-optional-and-what-type-it-wraps/32781143#32781143)。 – LopSae

-2

あなたはこれを達成するためにジェネリック医薬品を使用することができます。

func isOptional<T>(x:T?)->Bool 
{ 
    return true 
} 

func isOptional<T>(x:T)->Bool 
{ 
    return false 
} 

編集

上記のコードでは、変数は任意のタイプであるかどうかを知るために使用することができます。私はタイプを含む変数を知って考え出した 唯一の方法は、リフレクションを使用することです:

var t1:Any.Type=(String?).self 
var t2:Any.Type=(String).self 
Mirror(reflecting: t1).description 
Mirror(reflecting: t2).description 

ミラーの最初の呼び出しは、文字列"Mirror for Optional<String>.Type"を与え、第二は"Mirror for String.Type"を与えます。

私は、文字列を比較すると、このチェックを行うための便利な方法ではないことを理解し、私はよりパフォーマンス何かを見つけるために再試行します。..

+0

't'は決してオプションではありません。常にタイプオブジェクトです(おそらくオプションです)。常に2番目のメソッドが呼び出されます。 – idmean

+0

ok申し訳ありません、私は何かを見つけようとしています – hariseldon78

1

パーティーのために少し遅れ:代替はOptionalは、特定のプロトコルを拡張し、その型をチェックすることです。しかし、私は同じ問題に遭遇しました。ここに私のコードです。

func isOptional(_ instance: Any) -> Bool { 
    let mirror = Mirror(reflecting: instance) 
    let style = mirror.displayStyle 
    return style == .optional 
} 

let a: Int = 1 // false 
let b: Int? = 2 // true 
let c: Double = 3.0 // false 
let d: Double? = 4.0 // true 
let e: NSString = "Hello" // false 
let f: NSString? = "Hello" // true 


isOptional(a) // fasle 
isOptional(b) // true - warning 
isOptional(c) // false 
isOptional(d) // true - warning 
isOptional(e) // false 
isOptional(f) // true - warning 

いいですね。 swift4