Я выясняю свойства оберток в Swift, но мне, кажется, что-то не хватает.
Вот как я написал обертку свойств для используемой нами структуры внедрения зависимостей:
@propertyWrapper
struct Inject<Value> {
var _value: Value
var wrappedValue: Value {
get {
return _value
}
set {
_value = newValue
}
}
init(_ container: Container = AppContainer.shared) {
do {
_value = try container.resolve(Value.self)
} catch let e {
fatalError(e.localizedDescription)
}
}
}
Но когда я использую его в своем классе, как показано ниже, я получаю ошибку компиляции. Я видел много примеров того, что для меня делает одно и то же, но, вероятно, есть некоторые различия.
class X: UIViewController {
@Inject var config: AppConfiguration
....
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
config.johnDoSomething() // Compile error: 'AppConfiguration' is not convertible to 'AppConfiguration?'
}
}
За несколько дней go я натолкнулся на ссылку, что Xcode имел проблемы с компиляцией Дженери c Собственность Обертки, но я больше не могу ее найти. Я не уверен, что это актуально, но, может быть, кто-то из SO может мне помочь.
Использование Xcode 11.3.1
В соответствии с просьбой, представьте (один файл на игровой площадке):
import UIKit
/// This class is only to mimick the behaviour of our Dependency Injection framework.
class AppContainer {
static let shared = AppContainer()
var index: [Any] = ["StackOverflow"]
func resolve<T>(_ type: T.Type) -> T {
return index.first(where: { $0 as? T != nil }) as! T
}
}
/// Definition of the Property Wrapper.
@propertyWrapper
struct Inject<Value> {
var _value: Value
var wrappedValue: Value {
get {
return _value
}
set {
_value = newValue
}
}
init(_ container: AppContainer = AppContainer.shared) {
_value = container.resolve(Value.self)
}
}
/// A very minimal case where the compile error occurs.
class X {
@Inject var text: String
init() { }
}