一步步学习Swift

Swift学习之propertyWrapper

2023-04-20  本文已影响0人  冷武橘

属性包装器给代码之间添加了一层分离层,它用来管理属性如何存储数据以及代码如何定义属性。比如说,如果你有一个提供线程安全检查或者把自身数据存入数据库的属性,你必须在每个属性里写相关代码。当你使用属性包装,你只需要在定义包装时写一遍就好了,然后把管理代码应用到多个属性上。

1、propertyWrapper
@propertyWrapper
struct TwelveOrLess {
    var wrappedValue: Int {
        get { return 1}
    }
}
@propertyWrapper
struct TwelveOrLess {
    private var number = 0
    var wrappedValue: Int {
        get { return number }
        set { number = min(newValue, 12) }
    }
}

struct SmallRectangle {
    @TwelveOrLess var height: Int
    @TwelveOrLess var width: Int
}


var rectangle = SmallRectangle()
print(rectangle.height)
// Prints "0"
 
rectangle.height = 10
print(rectangle.height)
// Prints "10"
 
rectangle.height = 24
print(rectangle.height)

这个例子里需要让宽高都不能大于12,假如你自己直接要set,get方法就需要两遍差不多的代码。而使用属性包装,你只需要在定义包装时写一遍就好了,然后把管理代码应用到多个属性上。

truct  SmallRectangle{
    @TwelveOrLess var height: Int
    @TwelveOrLess var width: Int
    func test(){
        print(_height)
        print(height)
    }
}

print(_height) 输出:TwelveOrLess()
print(height)输出:24

struct SmallRectangle {
    private var _height = TwelveOrLess()
    private var _width = TwelveOrLess()
    var height: Int {
        get { return _height.wrappedValue }
        set { _height.wrappedValue = newValue }
    }
    var width: Int {
        get { return _width.wrappedValue }
        set { _width.wrappedValue = newValue }
    }
}
2、通过属性包装映射值:

@propertyWrapper
struct SmallNumber {
    private var number = 0
    var projectedValue = false
    var wrappedValue: Int {
        get { return number }
        set {
            if newValue > 12 {
                number = 12
                projectedValue = true
            } else {
                number = newValue
                projectedValue = false
            }
        }
    }
}
struct SomeStructure {
    @SmallNumber var someNumber: Int
}
var someStructure = SomeStructure()
 
someStructure.someNumber = 4
print(someStructure.$someNumber)
// Prints "false"
 
someStructure.someNumber = 55
print(someStructure.$someNumber)
// Prints "true"

3、SwiftUI常见的propertyWrapper

@State、@Binding、@ObservedObject、@EnvironmentObject、@StateObject

4、模仿@State的一个propertyWrapper
import SwiftUI
struct ContentView: View {

    @Test var h = "20"
    var body: some View {
        VStack {
            
                
            Text("Hello, world!").foregroundColor(.red)
            Button {
                h = "100"
               
            } label: {
               
                Text("点击")
            }

        }
        
    }
}
 class Object{
    var value:String = ""
}
@propertyWrapper
struct Test{
     var object:Object = Object()
     var wrappedValue: String{
            get{
                return object.value
            }
            nonmutating  set{
                
                object.value = newValue
            }
     }
     init(wrappedValue: String) {
     self.object.value = wrappedValue
     }
}

上一篇 下一篇

猜你喜欢

热点阅读