Свойство Wrapped с @propertyWrapper не будет возвращать упакованный тип - PullRequest
0 голосов
/ 25 сентября 2019

В этом упрощенном примере я делаю propertyWrapper объекта UInt для хранения натурального числа (целое число> 0).Мой собственный пример использует более сложный фильтр, но это показывает проблему.Вместо того, чтобы найти обходной путь, суть вопроса заключается в том, чтобы пролить свет на непонятную (для меня) ошибку.

При назначении простого UInt в списке появляется сообщение об ошибке.

Использование свойства wrappedValue, как показано в следующей строке, работает нормально.Но, конечно, весь смысл обертки в том, чтобы иметь возможность рассматривать его как UInt, возвращаемый get?

Ошибка "невозможно присвоить значение типа '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 голосов
/ 26 сентября 2019

Это не так, как работают оболочки свойств.Код:

init(nz: NonZero)

объявляет nz с типом NonZero, который является просто struct, определенным ранее, NonZero здесь не используется в качестве свойства с оболочкой.

Обернутое свойство используется в качестве атрибута в объявлении свойства, например:

@NonZero var num : UInt = 1

[Установка этого кода требует изменения метки параметра NonZero 's init должен быть изменен на wrappedValue, например:

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

]

Вы можете написать init из struct 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 Обертки свойств (Apple) и Оболочки свойств Swift (NSHipster) полезны.

HTH

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...