であれば、私は与えられたタイプt
(Any.Type
)は、オプションのタイプであるかどうかを判断しようとしている決定し、私はこのテストにがAny.Typeはオプション
t is Optional<Any>.Type
を使用していますが、それは常にfalseを返します。
これを達成する方法はありますか?
であれば、私は与えられたタイプt
(Any.Type
)は、オプションのタイプであるかどうかを判断しようとしている決定し、私はこのテストにがAny.Typeはオプション
t is Optional<Any>.Type
を使用していますが、それは常にfalseを返します。
これを達成する方法はありますか?
何をやろうとしているが、このようなものであると仮定すると:
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
あなたはこれを達成するためにジェネリック医薬品を使用することができます。
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"
を与えます。
私は、文字列を比較すると、このチェックを行うための便利な方法ではないことを理解し、私はよりパフォーマンス何かを見つけるために再試行します。..
't'は決してオプションではありません。常にタイプオブジェクトです(おそらくオプションです)。常に2番目のメソッドが呼び出されます。 – idmean
ok申し訳ありません、私は何かを見つけようとしています – hariseldon78
パーティーのために少し遅れ:代替は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
'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