2016-07-18 7 views
0

私は、すべてのパラメータが設定されているかどうかを判断できるデフォルトの拡張子を持つ小さなプロトコルを書きます。 (Swift 2.2)子が無しであるかどうかを判断する方法

私の考えは、Mirror型を使用して、指定された型のすべての子要素を取得し、反復処理することでした。このように:

typealias Child = (label: String?, value: Any) 

それがnilであれば、それはオプションではありませんので、だから私はただ、チェックすることはできません。

var isComplete: Bool { 
    get { 
     return Mirror(reflecting: self).children.reduce(true) { return $0 && $1.value != nil } // <- Error, because value is not Optional 
    } 
} 

問題がある、子供のタイプです。もし使用しているのがprint($1.value)なら、それはnilを出力するので、その背後にポインタマジックがあるはずです。

どのようにそのメモリアドレスを確認する方法。それとも、いくつかの簡単な方法は、

+0

何(1)この程度?それはポインタに関するいくつかの情報を与えるかもしれませんが、それは確かにハッキーでなければなりません。 (1)http://swiftdoc.org/v2.2/func/unsafeAddressOf/#func-unsafeaddressof_-anyobject – Mrwerdo

+0

確かに残念ながら、このパラメータはAnyObjectである必要があります。AnyはAnyしか持っていないので、イベントは機能しません と 'もしlet someObject = $ 1.valueとして? AnyObject { let somePointer = unsafeAddressOf(someObject) } ' のほとんどのプロパティは値型です。 – gujci

答えて

0

[OK]を、この機能を実装するために、https://stackoverflow.com/a/34637228/3308103

から解決策を得たポイントは、我々は再び値をミラーし、それが値を持っている場合は1でカウント子どもを、です取得する必要があります、ということです。

だから、解決策はハックですが、誰がそれを必要とする場合...

public protocol OptionalValueObservable { 
    var isComplete: Bool {get} 
    var hasAnyProperty: Bool {get} 
} 

public extension OptionalValueObservable { 
    var isComplete: Bool { 
     get { 
      return Mirror(reflecting: self).children.reduce(true) { acc, val in 
       let subMirror = Mirror(reflecting: val.value) 
       return acc && (subMirror.displayStyle == .Optional ? subMirror.children.count > 0 : true) 
      } 
     } 
    } 

    var hasAnyProperty: Bool { 
     get { 
      return Mirror(reflecting: self).children.reduce(false) { acc, val in 
       let subMirror = Mirror(reflecting: val.value) 
       return acc || (subMirror.displayStyle == .Optional ? subMirror.children.count > 0 : true) 
      } 
     } 
    } 
} 
関連する問題