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
我正在研究 属性 包装器 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