0

我创建了以下扩展:

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是不同类型的),我将如何去做?

4

1 回答 1

2

我正在使用您的扩展程序:

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

结果如下图所示:

在此处输入图像描述

于 2022-02-19T05:58:32.487 回答