使用@propertyWrapper封装的属性不会返回封装的类型

时间:2019-09-25 12:17:46

标签: swift5.1

在这个简化的示例中,我制作了一个UInt的propertyWrapper来保存自然数(整数> 0)。我自己的示例使用了更复杂的过滤器,但这显示了问题。问题的重点不是要找到解决方法,而是要阐明令人困惑的错误(对我而言)。

将其分配给简单的UInt会列出错误消息。

使用下面一行中的wrappedValue属性可以正常工作。但是,确定包装的全部目的是能够将其视为get返回的UInt吗?

错误“无法将类型'NonZero'的值分配给类型'UInt”似乎破坏了包装器类型的全部内容。我有什么误会? Xcode 11.0

import Foundation

@propertyWrapper
struct NonZero {
      private let myNumber : UInt

    init(n : UInt)
    {
     if ( n == 0){fatalError(" cannot be 0")}
        myNumber = n
    }
   var wrappedValue: UInt {
    get { return myNumber }
    }
}


struct Nums {

    var num :UInt

    init( nz:  NonZero){
        num = nz                //error message "cannot assign value of type 'NonZero' to type 'UInt"
        num = nz.wrappedValue   //no error
    }
}

1 个答案:

答案 0 :(得分:0)

这不是属性包装器的工作方式。代码:

init(nz: NonZero)

声明nz具有类型NonZero –只是前面定义的struct,此处NonZero未被用作包装属性。

包装的属性用作属性声明上的属性,例如:

@NonZero var num : UInt = 1

[将代码放入代码中需要将NonZero的{​​{1}}的参数标签更改为init,例如:

wrappedValue

]

您可以将init(wrappedValue : Uint) { ... wrappedValue ... } 的{​​{1}}写为:

init

继续探索!您可能会发现SE-0259 Property Wrappers(Apple)和Swift Property Wrappers(NSHipster)有用。

HTH