Swift属性包装器@propertyWrapper

77 阅读1分钟

个人理解:属性包装器是对 set、get方法的封装,不同的属性有相似的set、get,使用属性包装器可以简化相似的代码。

有两个要求

  • 必须使用属性@propertyWrapper进行定义。
  • 它必须具有wrappedValue属性。

简单使用

使用@propertyWrapper创建一个 ClamppedValue,该结构体保证被封装的值number不能小于0大于255,如果我们存储的值大于255,那么属性返回255 小于0 返回 0

@propertyWrapper

struct ClamppedValue {

    private var number: Int = 0

    var wrappedValue: Int {

        get {

            return self.number

        }

        set {

            if newValue < 0{

                self.number = 0

            }else if newValue > 255{

               self.number = 255

            }else{

                self.number = newValue

            }
        }

    }

    init(wrappedValue initValue:Int) {

        self.wrappedValue = initValue

    }

}

  
struct MyColor {

    @ClamppedValue var red: Int

    @ClamppedValue var green: Int

    @ClamppedValue var blue: Int

}

var setColor:MyColor = MyColor(red: 256, green: 50, blue: 50)


print("color red is \(setColor.red)") // 255

通过上面的代码可以看出:

  • red和greed和blue初始值为0
  • 设置greed为50,其值有效,满足条件,number将会被设置为50,所以打印为50
  • 设置red为256,超过最大值255,所以number将会被设置为255,打印为255