在swift中使用@propertyWrapper隐式展开可选的替代方法

在swift中使用@propertyWrapper隐式展开可选的替代方法,swift,mvvm,dependency-injection,optional,property-wrapper,Swift,Mvvm,Dependency Injection,Optional,Property Wrapper,当初始化器注入无法工作或创建mvvm模块时,我发现自己使用了很多隐式展开的选项,例如: class TodoView: UIViewController { var viewModel: TodoViewModelProtocol! } 例如,如果我需要对显式展开的可选变量使用switch语句,那么它不仅看起来不太好,而且总是强制展开也是一种痛苦 有没有办法摆脱隐式展开的可选选项,例如在swift 5中使用@properyWrapper?您可以使用属性包装模拟隐式展开的选项

当初始化器注入无法工作或创建mvvm模块时,我发现自己使用了很多隐式展开的选项,例如:

class TodoView: UIViewController {
    
    var viewModel: TodoViewModelProtocol!

}
例如,如果我需要对显式展开的可选变量使用switch语句,那么它不仅看起来不太好,而且总是强制展开也是一种痛苦


有没有办法摆脱隐式展开的可选选项,例如在swift 5中使用
@properyWrapper

您可以使用属性包装模拟隐式展开的选项,如下所示:

@propertyWrapper
struct MaybeUninitialized<T> {
    private var storage: T?
    var wrappedValue: T {
    get { storage! }
    set { storage = newValue}
    }
}

切换到SwiftUI,依赖注入是一个可行的选项。此外,如果不使用情节提要,可以对
UIViewController
子类使用依赖项注入。但是,对于
UIView
s,无法创建自定义初始值设定项,因此无法正确使用依赖项注入。那么,您如何在示例中分配属性?谢谢您的介绍!swiftUI看起来很有前途,我会检查它!目前,我正在使用“生成器”类分配每个属性。非常感谢,这正是我所寻找的,我认为这非常好!如何处理变量需要弱的情况?如何创建一个使用
私有弱变量存储:T?
的属性包装(
struct weakmaybeuniInitialized
)的变量?这有一个很好的副作用,即弱字段所需的可选项也会自动展开。非常感谢,我像您所说的那样尝试过,但当我将其应用于协议时,会出现错误“Property type‘SomeProtocol与其包装类型‘WeakMaybeUninitialized’的‘wrappedValue’属性不匹配”即使某些协议符合任何对象。你知道发生了什么事吗?那会很有帮助的!例如,如果我有协议SomeProtocol:AnyObject{},那么它可以工作:弱var测试:SomeProtocol?但这不起作用,并返回上面的错误:@WeakMaybeUninitialized var test:someprotocol使用协议作为类型会导致不符合任何协议(包括AnyObject)的类型。因此,我所知道的使用协议类型进行此操作的唯一方法是使用动态强制转换:
@propertywraper struct weakmaybeuniInitialized{private-weakvar-storage:AnyObject?=nil-var-wrappedValue:T{get{storage!as!T}set{storage=newValue-as!AnyObject}}
@MaybeUninitialized var x: Int?

print(x) // will crash
x = nil
print(x) // print nil