Как инициализировать необязательный UInt из необязательного Int? - PullRequest
0 голосов
/ 31 мая 2018

Я хочу преобразовать необязательный Int в необязательный UInt:

let optionalNumber : Int?
//later in code
let optionalPositiveNumber = UInt(optionalNumber)

выдает ошибку:

Cannot invoke initializer for type 'Uint' with an argument list of type (Int?)

Я могу решить эту проблему, создав следующее расширение для UInt:

extension UInt {
   init?(_ number : Int?) {
       if let number = number {
           self = UInt(number)
       }
   }
}

Есть ли способ преобразовать Int? в UInt? без использования расширений или проверки состояния (if, guard)?

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Вы можете map необязательный:

var optionalNumber : Int?

//later in code
let optionalPositiveNumber = optionalNumber.map { UInt($0) }

Из документации :

Оценивает данное закрытие, когда этот необязательный экземпляр не ноль, передав в качестве параметра развернутое значение.

func map<U>(_ transform: (Wrapped) throws -> U) rethrows -> U?

Таким образом, результатом является UInt? в соответствии с запросом и либо nil, либо преобразованное число со знаком.

Обратите внимание, что преобразование не будет выполнено (и произойдет сбой с исключением времени выполнения), если заданное число будет отрицательным. Если это проблема, лучшим вариантом может быть

let optionalPositiveNumber = optionalNumber.flatMap { UInt(exactly: $0) }

, который возвращает nil, если заданное число равно nil или отрицательно.

0 голосов
/ 31 мая 2018

Вы можете создать его с помощью ?? и передать значение по умолчанию, если оно равно nil

let optionalPositiveNumber = UInt(optionalNumber ?? 0)

Так что, если ваш optionNumber равен nil, он будет инициализирован с 0

РЕДАКТИРОВАНИЕ, предложенное vacawama

let optionalPositiveNumber = UInt(exactly: optionalNumber ?? -1)

, если значение, переданное как source, не может быть точно представлено, результат будет nil.

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