属性 包装器:将空更改为可选

Property wrapper: change empty to Optional

我创建了以下扩展:

import Foundation

extension Collection {
    /// Returns `nil` if empty
    var nonEmptyValue: Self? {
        isEmpty ? nil : self
    }
}

现在我想让它成为一个 属性 包装器,这样我就可以像这样使用它:

final class MyClass {
    @NonEmpty
    var string: String? = "test"
}

这个想法是,只要将空字符串分配给 属性,它就会被替换为 nil

是否有可能创建这样一个 属性 包装器(因为 String?String 是不同的类型),我将如何去做?

我正在使用您的分机:

import Foundation

@propertyWrapper
struct NonEmpty<T: Collection> {
    
    var wrappedValue: T? {
        didSet {
            self.wrappedValue = wrappedValue?.nonEmptyValue
        }
    }
    
    init(wrappedValue: T?) {
        self.wrappedValue = wrappedValue?.nonEmptyValue
    }
}

extension Collection {
    /// Returns `nil` if empty
    var nonEmptyValue: Self? {
        isEmpty ? nil : self
    }
}

结果如下图所示: