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

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

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

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
}

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


person Andrew    schedule 25.04.2020    source источник


Ответы (3)


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

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™" способом (и если вы согласны с созданием непустого string для случая, когда предоставляется только 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
}
person Tyler    schedule 25.04.2020
comment
Вы можете удалить это, начав size и ноль, и добавив к нему 36 (до) два раза. - person Alexander; 25.04.2020

Как говорит ошибка:

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

Это означает, что firstName != nil && lastName != nil не соответствует действительности. Ошибка, которую вы получаете, находится здесь:

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

вероятно, firstName также равен нулю.

Вы можете проверить такие строки, как firstName .isEmpty. Он проверяет наличие nil и "" (пустая строка).

person Diogo Nunes    schedule 25.04.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
}

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

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

person NicolasElPapu    schedule 25.04.2020