2017-06-21 2 views
1

イムスウィフト:チェックオブジェクト内の任意のプロパティがゼロである場合 - 任意の方法は、オブジェクト内のすべてのプロパティは、値を有する場合</p> <p>例:nilを/確認するために利用可能であるかどうかを疑問に思う3</p> <p>スウィフトを用いて3

私はobjCarのすべてのプロパティの値がある場合にのみtrueを返す{anyProperty}メソッドを検索しています。我々の場合には、objCarには、モデルとVINを持っていないので、{anyProperty}が偽であると私は、これは私のように、生産のアプリを使用するかどうか分からない場合はループ

Plsのアドバイス

+1

はそれも彼らが最初の場所で任意で持っている意味を成していますか? 'Car' ***は' name'、 'model'、' VIN'を持つ必要があります。また 'model'と' VIN'は変更できないので、それらを 'var'変数にするのは意味がありません – Alexander

+0

こんにちはAlexander、指摘に感謝します。要件があった。申し訳ありませんが、その時点で良い例を見つけることができません – Jack

答えて

2

これを強くお勧めします。状態の検証は、クラス内から行われるべきものです。クラスの中から、妥当性をチェックする方法をよく知っておくべきです。

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 
    } 
} 
5

から出てきます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

'$ 0.value Any? != nil'または 'let _ = $ 0.valueをAny?'の代わりに 'case optional .some(_)= $ 0.value'の代わりに使用します。 –

+0

@ 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

+0

申し訳ありませんが私の悪い、私はそれが間違っても元のコメントを残します。 'Mirror($ 0.value反映).descendant(some)!= nil'とはどういう意味ですか?私はそれが事例比較よりもはっきりとした意味を持っていると思う。 –

0

あなたはフィールドの多くを持っている場合は、このアプローチを使用することができます。

struct S { 
    let x: String? 
    let y: Int 
    let z: Bool 

    func hasNilField() -> Bool { 
     return ([x, y, z] as [Any?]).contains(where: { $0 == nil}) 
    } 
} 
関連する問題

 関連する問題