2015-01-31 3 views
0

Я хочу построить структуру, как в доске, где тип значения обернут так, что BlackboardValue можно обойти без ограничения того типа, который он фактически хранит.Класс, представляющий любое значение. Тип должен быть скрытым, но тип должен быть сопоставим.

Во-вторых, мне нужно проверить, соответствуют ли два BlackboardValue s значение того же типа. Использование BlackboardValue<T> не будет работать, поскольку кажется, что BlackboardValue<String> не может храниться рядом с BlackboardValue<Double> и другими проблемами. BlackboardValue должен быть одного типа.

Я думаю, что проблема может быть сведена к тому, что я, кажется, не в состоянии проверить, если два Упаковщики держать один и тот же тип:

import Foundation 

class Wrapper { 
    var value: Any? 

    init(v: Any) { 
     self.value = v 
    } 
} 

func wrappersHoldTheSameValueType(w1: Wrapper, w2: Wrapper) -> Bool { 
    return false 
} 

var w = Wrapper(v: "Hans") 
var d = w.value as String 

ответ

1

Я нашел способ сделать это. Попробуйте это.

func wrappersHoldTheSameValueType(w1: Wrapper, w2: Wrapper) -> Bool { 
    let typeidof = { (a: Any) in 
     unsafeBitCast(reflect(a).valueType, uintptr_t.self) 
    } 
    switch ((w1.value, w2.value)) { 
     case let (.Some(a), .Some(b)): 
      return typeidof(a) == typeidof(b) 
     case (nil, nil): 
      return true 
     default: 
      return false 
    } 
} 

Немного неудобно, но, по-видимому, работает хотя бы пока.

wrappersHoldTheSameValueType(Wrapper(v:1), Wrapper(v:2))   // ==> true 
wrappersHoldTheSameValueType(Wrapper(v:"a"), Wrapper(v:"b"))  // ==> true 
wrappersHoldTheSameValueType(Wrapper(v:["a"]), Wrapper(v:["b"])) // ==> true 
wrappersHoldTheSameValueType(Wrapper(v:UIView()), Wrapper(v:1)) // ==> false 
wrappersHoldTheSameValueType(Wrapper(v:[1]), Wrapper(v:["a"])) // ==> false 
+0

Я буду принимать ответ, поскольку он работает. Но я думаю, что многие люди будут рады, если эта информация будет обновлена, когда кто-то найдет «более чистые» решения. Но да, это работает для всех типов, которые я пробовал. – Alex

+0

Поскольку у вас есть более глубокое понимание внутренних работ: есть ли у вас идея сравнить обертку (ее значение) и тип типа isOfType (значение, тип) -> Bool ..? – Alex

+0

Здесь https://gist.github.com/hisui/4b0ac6f8591c0396f838 – findall

Смежные вопросы