У меня есть несколько структур Foo
, Bar
, Baz
, и я использую приведенную ниже функцию для чтения plist в словарь [String: Foo]. И у меня есть метод, который создает словарь [String: Bar] и т. д. Все это работает хорошо.
func loadFoo() -> [String : Foo]? {
guard
let path = Bundle.main.path(forResource: "foo", ofType: "plist"),
let plistDict = NSDictionary(contentsOfFile: path) as? [String : AnyObject]
else { return nil }
var dict = [String : Foo]()
for (key, f) in plistDict {
if let info = f as? [String : AnyObject] {
let foo = Foo(symbol: key, info: info)
dict[key] = foo
}
}
return dict
}
Конечно, это кричит «используйте дженерики», но я пока не смог заставить его работать. Например, я заменил Foo
на <A>
или A
, но получил кучу ошибок компилятора (сейчас я далеко от своего Mac, поэтому не могу воспроизвести здесь ошибки).
Любые предложения, как решить эту проблему?
myFooDict = loadFoo()
не работает (unresolved identifier loadFoo
). 14.09.2016Baz
, напишитеmyFooDict = loadFoo<Baz>()
14.09.2016loadFoo
? Я попробовал это как расширениеLoadable
и получил указанную выше ошибку. Если я перенесу его изLoadable
, ошибка будет:Cannot explicitly specialize a generic function
иWhile parsing this '<' as a type parameter bracket
. 14.09.2016Generic parameter 'T' could not be inferred
и `При вызове функции 'loadFoo' 14.09.2016Fooable
->struct Baz : Fooable { ...
. Сообщение об ошибке может ввести в заблуждение. 15.09.2016