Быстрая обработка ноль - PullRequest
       3

Быстрая обработка ноль

0 голосов
/ 25 апреля 2020

Я новичок в Swift, и это код, который дает мне ошибку, и каким-то образом он проходит " lastName! = Nil ", даже если у него нет текста.

Поток 1: фатальная ошибка: неожиданно обнаружен ноль при развертывании необязательного значения

func imageFromInitials(firstName: String?, lastName: String?, withBlock: @escaping (_ image: UIImage) -> Void) {

var string: String!
var size = 36

if firstName != nil && lastName != nil {
    string = String(firstName!.first!).uppercased() + String(lastName!.first!).uppercased()
} else {
    string = String(firstName!.first!).uppercased()
    size = 72
}

Я запутался и не уверен, почему проверка не сработала

Ответы [ 3 ]

3 голосов
/ 25 апреля 2020

Строка, являющаяся пустой, отличается от нулевой. Вам также необходимо проверить, являются ли строки пустыми, или просто безопасно развернуть первый символ имени и фамилии:

func imageFromInitials(firstName: String?,
                       lastName: String?,
                       withBlock block: @escaping (_ image: UIImage) -> Void) {
    let string: String
    let size: Int

    if let firstInitial = firstName?.first {
        if let lastInitial = lastName?.first {
            string = (String(firstInitial) + String(lastInitial)).uppercased()
            size = 36
        } else {
            string = String(firstInitial).uppercased()
            size = 72
        }
    } else {
        string = ""
        size = 36
    }

    // the rest of your function
}

Или, если вы хотите сделать это более "Swifty ™" way (и если у вас все в порядке с производством непустого string для случая, когда only , предоставляется lastName) , тогда вы можете сделать это:

func imageFromInitials(firstName: String?,
                       lastName: String?,
                       withBlock block: @escaping (_ image: UIImage) -> 
    let string = [firstName, lastName]
        .compactMap { $0?.first }
        .map { String($0) }
        .joined()
        .uppercased()

    let size = string.count == 1 ? 72 : 36

    // the rest of your function
}
2 голосов
/ 25 апреля 2020

Как гласит ошибка:

Неожиданно найдено nil при развертывании необязательного значения

Это означает, что firstName! = Nil && lastName! = ноль не соответствует действительности. Вы получаете ошибку здесь:

string = String(firstName!.first!).uppercased()

вероятно firstName также равно nil.

Вы можете проверить строки, подобные этой firstName .isEmpty . Проверяет ноль и "" (пустая строка).

1 голос
/ 25 апреля 2020

Вы также можете использовать оператор switch следующим образом, чтобы иметь больше контроля над происходящим:

func imageFromInitials(firstName: String?, lastName: String?, withBlock: @escaping (_ image: UIImage) -> Void) {

var string = ""
var size = 36

    switch (firstName?.first, lastName?.first) {

    case (.some(let first), .some(let last)):
        string = first.uppercased() + last.uppercased()
    case (.some(let first), nil):
        string = first.uppercased()
        size = 72
    case (nil, .some(let last)):
        string = last.uppercased()
        size = 72
    default:
        print("Both are nil, something is wrong")

    }
    print(string)
    // your code
}

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

Swift: проверка на необязательное значение в регистре коммутатора

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