私はobjCarのすべてのプロパティの値がある場合にのみtrueを返す{anyProperty}メソッドを検索しています。我々の場合には、objCarには、モデルとVINを持っていないので、{anyProperty}が偽であると私は、これは私のように、生産のアプリを使用するかどうか分からない場合はループ
Plsのアドバイス
私はobjCarのすべてのプロパティの値がある場合にのみtrueを返す{anyProperty}メソッドを検索しています。我々の場合には、objCarには、モデルとVINを持っていないので、{anyProperty}が偽であると私は、これは私のように、生産のアプリを使用するかどうか分からない場合はループ
Plsのアドバイス
これを強くお勧めします。状態の検証は、クラス内から行われるべきものです。クラスの中から、妥当性をチェックする方法をよく知っておくべきです。
class Vehicle {
var name: String?
var model: String?
var VIN: String?
func isReadyToAdvance() -> Bool {
return name != nil && model != nil && VIN != nil
}
}
let objCar = Vehicle()
objCar.name = "Volvo"
if objCar.isReadyToAdvance() {
// Go to other screen
}
彼らはそのメソッドをオーバーライドすることができますisReadyToAdvance()
のために異なるルールを持つサブクラスがある場合。
isReadyToAdvance()
が、その後の拡張として追加し、基本クラスのために意味をなさない場合。
extension Vehicle {
func isReadyToAdvance() -> Bool {
return name != nil && model != nil && VIN != nil
}
}
から出てきますSwiftでのリフレクションに慣れていない(Mirror
を使用しています)、それにマイナス面(パフォーマンスなど)があるかどうかはわかりません。ここで
は行く:
class Vehicle {
var name : String?
var model: String?
var VIN: String?
}
let objCar = Vehicle()
objCar.name = "Volvo"
objCar.model = "242DL"
objCar.VIN = "123456"
let hasMissingValues = Mirror(reflecting: objCar).children.contains(where: {
if case Optional<Any>.some(_) = $0.value {
return false
} else {
return true
}
})
print(hasMissingValues)
hasMissingValues
は、上記の例ではfalseになります(Vehicle
のすべてのプロパティが設定されています)。たとえば、model
が設定されている行をコメントして、hasMissingValues
の値がtrueになるようにします。
注:nilに(タイプAny
の)$0.value
を比較するためのより良い方法があるかもしれません。また、これはクラスの任意のタイプのプロパティ(String
ではない)に対しても機能します。
'$ 0.value Any? != nil'または 'let _ = $ 0.valueをAny?'の代わりに 'case optional
@ JefferyThomas、それらの比較は私のために働いていません。 '$ 0.value'の型は' Any'です。値が設定されていない(すなわち 'nil 'である)子に対して、' $ 0.value'を印刷すると 'nil'を出力し、' $ 0.valueをAnyとして出力する 'は 'Optional(nil)'を表示します。しかし、これらのどちらも 'nil'(==を使用)と比較してもどちらも' true'を与えません。これはSwiftが自然に 'Any'型の変数にnilを設定することは許されないからです。なぜなら、' Any'が 'Optional'を含む任意の型を保持できるとしても、[この質問](https:// 34644128/why-non-optional-any-can-hold-nil) – paulvs
申し訳ありませんが私の悪い、私はそれが間違っても元のコメントを残します。 'Mirror($ 0.value反映).descendant(some)!= nil'とはどういう意味ですか?私はそれが事例比較よりもはっきりとした意味を持っていると思う。 –
あなたはフィールドの多くを持っている場合は、このアプローチを使用することができます。
struct S {
let x: String?
let y: Int
let z: Bool
func hasNilField() -> Bool {
return ([x, y, z] as [Any?]).contains(where: { $0 == nil})
}
}
はそれも彼らが最初の場所で任意で持っている意味を成していますか? 'Car' ***は' name'、 'model'、' VIN'を持つ必要があります。また 'model'と' VIN'は変更できないので、それらを 'var'変数にするのは意味がありません – Alexander
こんにちはAlexander、指摘に感謝します。要件があった。申し訳ありませんが、その時点で良い例を見つけることができません – Jack