在用Swift语言将值指定给属性之前,我们如何验证和调整该值?

在用Swift语言将值指定给属性之前,我们如何验证和调整该值?,swift,Swift,在Java中,为了确保为属性分配有效的值,我们可以将属性设置为私有,但有一个setter方法来接收和定制值。但是,在Swift中执行相同操作的最佳实践是什么 存储属性的getter和setter方法似乎会传播警告消息。根据您希望对setter/getter的逻辑进行何种控制,至少有两种方法 普通的快速接球手和接球手对。您需要记住的是,如果您提供自定义getter/setter,那么Swift将不会为您合成存储的属性。相反,您必须创建一个自己的、独立于公共var: class-MyClass{ 私

在Java中,为了确保为属性分配有效的值,我们可以将属性设置为私有,但有一个setter方法来接收和定制值。但是,在Swift中执行相同操作的最佳实践是什么


存储属性的getter和setter方法似乎会传播警告消息。

根据您希望对setter/getter的逻辑进行何种控制,至少有两种方法

  • 普通的快速接球手和接球手对。您需要记住的是,如果您提供自定义getter/setter,那么Swift将不会为您合成存储的属性。相反,您必须创建一个自己的、独立于公共
    var
  • class-MyClass{
    私有var\u myProperty:Int
    公共变量myProperty:Int{
    设置{
    //newValue是一个隐式变量
    /考虑它好像你有一些类似SEMyFipe(int NealValm){}
    //记住newValue是不可变的,所以
    //无法直接修改它,但可以为其分配其他内容
    //_myProperty
    self.\u myProperty=newValue
    }
    得到{
    返回self.\u myProperty
    }
    }
    }
    
    比如:

    var myProperty:Int{
    设置{
    self.myProperty=newValue
    }
    得到{
    返回self.myProperty
    }
    }
    
    不工作,因为
    self.myProperty=…
    将调用
    myProperty
    的setter并
    返回self。myProperty
    将调用
    myProperty
    的getter。这是一个无限递归调用。Java的等价物是:

    公共类MyClass{
    私有财产;
    公共void setMyProperty(int newValue){
    此.setMyProperty(newValue);
    }
    public int getMyProperty(){
    返回此.getMyProperty();
    }
    }
    
    我知道Swift自动调用getter/setter而不是访问存储属性的内存有点扭曲,但它就是这样工作的

    请注意,您必须为上面的
    \u myProperty
    提供一些默认值,可以在
    init
    中,也可以直接在声明属性的地方提供(但这超出了答案的范围,我提到它只是为了让您知道,如果没有细微的更改,上述代码将无法编译)

  • 使用属性包装器。这对于共享相同get/set逻辑的某些类型的属性特别有用。例如,考虑自定义设置器的常规示例,在这里您要确保数值位于区间[MimValueMax值]中。您可以在属性包装器中共享该逻辑,而不是为每个此类属性编写自定义getter并将
    newValue
    与最小值和最大值进行比较:
  • @propertyWrapper
    结构夹紧{
    var值:value
    让范围:ClosedRange
    init(wrappedValue值:value,uu范围:ClosedRange){
    前提条件(范围.包含(值))
    自我价值=价值
    self.range=范围
    }
    var wrappedValue:Value{
    获取{value}
    设置{value=max(range.lowerBound,min(newValue,range.upperBound))}
    }
    }
    
    用法:

    class-MyClass{
    @钳位(0…10)var myProperty:Int=5
    }
    

    这将确保
    myProperty
    介于0和10之间。属性包装器有很多用法(另一个例子是原子访问属性),它们只是一些应用于某些属性的“共享getter/setter”函数。这只是一些语法上的糖分,可以避免你一次又一次地重复写同样的逻辑。

    你说的警告消息是什么意思
    通过此函数的所有路径都将调用自身
    是您收到的消息类型吗?这正是我想要的解决方案。这种设计使得快速值验证有点麻烦。