2016-02-11 4 views
1

У меня есть Swift.Dictionary структуру какКак объявить типичный словарь словарей в Swift?

let tests:[ [String:Any] ] = [ 
      [ "f" : test1, "on" : true ], 
      [ "f" : test2, "on" : false ], 
      [ "f" : test3, "on" : false ], 
      [ "f" : test4, "on" : false ], 
      [ "f" : test5, "on" : false ] 
     ] 

, где f является closure типа ()->() и on является Bool. Я использую это, чтобы перечислить и eval закрытия на основе on значения:

for (_, test) in tests.enumerate() { 
     if test["on"] as! Bool { 
      let f:()->()=test["f"] as!()->(); 
      f(); 
     } 
    } 

Как явно объявить эту Swift.Dictionary структуру для того, чтобы избежать разворачивать и заставить конвертировать с as!:

let f:()->()=test["f"] as!()->(); 
+1

Используйте вместо этого кортеж. – matt

+1

Или даже легкая структура (это то, что я делаю в точно подобной ситуации в одном из моих приложений) – matt

ответ

3

Это работает? Также он выглядит намного чище.

typealias MyClosure = (() ->()) 
typealias MyTuple = (f: MyClosure, on: Bool) 

let tests: [MyTuple] = [ etc... 

for item in tests { 
    if item.on { 
     let f = item.f 
     f() 
    } 
} 
+0

Да +1 это то, что я искал! – loretoparisi

+0

@loretoparisi No Problem – brimstone

+3

Но все, что он сделал, было именно тем, что я сказал, кортежем. – matt

3

Это очень неуместное использование словаря. Создайте массив кортежей или даже массив легкой структуры, разработанной для этой цели, т. Е. Для переноса пары замыкания-Bool.

+0

нормально, но с точки зрения языка, можно объявить '[String:() ->()]' и массив '[[String:() ->()]]', но, пожалуйста, ответьте на вопрос: возможно ли явно объявить тип типа '[String:() ->(), String: Bool]'? – loretoparisi

+1

Вам не нужно. Кортеж или структура несет пару значений. – matt

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