0

在这个简化的示例中,我创建了 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
    }
}
4

1 回答 1

0

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

init(nz: NonZero)

声明nz具有类型NonZero——这只是struct前面定义的,NonZero这里没有被用作包装属性。

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

@NonZero var num : UInt = 1

[将其放入代码中需要将NonZero's的参数标签init更改为wrappedValue,例如:

init(wrappedValue : Uint) { ... wrappedValue ... }

]

您可以将 of 写initstruct Nums

init(nz: UInt)
{
   num = nz // ok *after* you add a `set` to `NonZero`, will `fatalError` if `nz` is zero
   let unwrapped : UInt = num // ok
   print(unwrapped) // so you see it worked
}

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

高温高压

于 2019-09-25T23:56:07.630 回答