Swift 5.1 中 属性 包装器的编译错误

Compile error on Property Wrapper in Swift 5.1

我正在研究 属性 包装器 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 中使用它时,出现编译错误。我看过很多例子,它们对我来说完全相同,但可能存在一些差异。

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?'
    }
}

几天前,我遇到了一个参考文献,其中 Xcode 有通用 属性 包装器的编译问题,但我找不到了。我不确定这是否相关,但也许 SO 上的某个人可以帮助我。

使用 Xcode 11.3.1

根据要求,特此提供一个 reprex(playground 中的一个文件):

import UIKit

/// This class is only to mimick the behaviour of our Dependency Injection framework.
class AppContainer {
    static let shared = AppContainer()

    var index: [Any] = ["Whosebug"]

    func resolve<T>(_ type: T.Type) -> T {
        return index.first(where: { [=14=] 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() { }
}

只是处理你的"reprex":

改变

@Inject var text: String

@Inject() var text: String