2016-07-18 4 views
0

Я собираюсь написать небольшой протокол с расширением по умолчанию, который может решить, установлены ли все параметры. (Swift 2.2)Как решить, является ли ребенок нулевым или нет

Моя идея состояла в том, чтобы использовать тип Mirror и получить все дочерние элементы заданного типа, а не перебирать их. Как это:

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

Проблема заключается в типе ребенка, который:

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

Так я не могу просто проверить, если она равна нулю, так как он не является факультативным. Если используется print($1.value), он печатает нуль, поэтому за этим должна быть указательная магия.

Любые идеи, как проверить адрес памяти этого. Или, возможно, некоторые более простой способ реализовать эту функциональность

+0

Что об этом (1)? Это может дать вам некоторую информацию о указателе, но это наверняка получило хакерство. (1) http://swiftdoc.org/v2.2/func/unsafeAddressOf/#func-unsafeaddressof_-anyobject – Mrwerdo

+0

Конечно, но, к сожалению, для этого требуется, чтобы его параметр был AnyObject, у меня есть только Any, поэтому он не будет работать. с 'if let someObject = $ 1.value как? AnyObject { let somePointer = unsafeAddressOf (someObject) } ' вызывает большинство свойств - типы значений. – gujci

ответ

0

Ok, получили решение от https://stackoverflow.com/a/34637228/3308103

Дело в том, что мы должны Зеркальное значение снова и получить его детей, которые просчитывают является 1, если это имеет значение ,

Таким образом, решение является Hacky, но если кто-то нуждается в этом ...

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