Swfit 4: Как я могу получить Optional <X>для печати описания, которое включает `Optional` - PullRequest
0 голосов
/ 25 мая 2018

Мне известно, что необязательные значения "под капотом" представлены как Optional enum ...

public enum Optional<Wrapped> { case none case some(Wrapped) }

В некоторой степени это скрыто отразработчики (по уважительной причине) и, следовательно, при печати опций поведение по умолчанию (в Swift 4) состоит в том, чтобы пропустить часть Optional и просто вывести либо nil, либо только одно значение.

let longFormDefinedOptionalInt: Optional<Int> = nil
let shortFormDefinedOptionalInt: Int? = 99

print("\(longFormDefinedOptionalInt)") // Prints "nil" and NOT "Optional.none"
print("\(longFormDefinedOptionalInt)") // Prints "99" and NOT "Optional.some(99)"

Есть лив любом случае получите полное и истинное описание дополнительного, то есть либо «Optional.none», либо «Optional.some (99)»

Я уверен, что это возможно, потому что XCTest делает это каким-то образом при печати сообщений об ошибках,например ...

XCTAssertEqual(Int("99"), 11)

Ошибка XCTAssertEqual: ("Необязательно (99)") не равно ("Необязательно (11)")

1 Ответ

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

Я думаю, что XCTest использует debugDescription:

let a: Int? = 1
print(a.debugDescription) // Optional(1)

Однако при значениях nil это свойство вернет "nil" вместо "Optional.none".

Вы можете написать расширение:

extension Optional {
    var fullDescription: String {
        switch self {
        case .none:
            return "Optional.none"
        case .some(let value):
            return "Optional.some(\(value))"
        }
    }
}

let a: Int? = nil
print(a.fullDescription)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...