は単にAny
に包まれたプロパティ値でnil
コンテンツをチェックするために、あなたは、他の回答に記載された方法に反して、実際に鋳造/結合/ Any
タイプ以外のコンクリートにチェックを中心にあなたのように動作することができますOptional<Any>.none
またはOptional<Any>.some(...)
にパターンマッチングを直接適用することにより、
例のセットアップ(異なるメンバーの種類:我々は単にnil
コンテンツをチェック反射のためにすべてのこれらの異なるタイプに注釈を付けたくない)
struct MyStruct {
let myString: String?
let myInt: Int?
let myDouble: Double?
// ...
init(_ myString: String?, _ myInt: Int?, _ myDouble: Double?) {
self.myString = myString
self.myInt = myInt
self.myDouble = myDouble
}
}
シンプルなログ:nil
値プロパティ
のプロパティ名を抽出
パターン一致がOptional<Any>.none
の場合、単にnil
エンティティのログ情報をログに記録する場合:
for case (let label as String, Optional<Any>.none) in
Mirror(reflecting: MyStruct("foo", nil, 4.2)).children {
print("property \(label) is nil")
}
/* property myInt is nil */
もう少し詳細なログ:以下Optional<Any>.some(...)
に一致nil
だけでなく、非nil
値を持つプロパティ
柄のため、場合にあなたがより多くの詳細なログをしたい(バインドさx
値はnil
非あなたの保証に対応Any
インスタンス)の代わりswitch
ケースを用い
for property in Mirror(reflecting: MyStruct("foo", nil, 4.2)).children {
if let label = property.label {
if case Optional<Any>.some(let x) = property.value {
print("property \(label) is not nil (value: \(x))")
}
else {
print("property \(label) is nil")
}
}
}
/* property myString is not nil (value: foo)
property myInt is nil
property myDouble is not nil (value: 4.2) */
または、後者:
for property in Mirror(reflecting: MyStruct("foo", nil, 4.2)).children {
switch(property) {
case (let label as String, Optional<Any>.some(let x)):
print("property \(label) is not nil (value: \(x))")
case (let label as String, _): print("property \(label) is nil")
default:()
}
}
/* property myString is not nil (value: foo)
property myInt is nil
property myDouble is not nil (value: 4.2) */