Penanganan cepat nihil [duplikat]

Saya baru mengenal Swift dan ini adalah kode yang memberi saya kesalahan dan entah bagaimana bisa melewati "lastName != nil" meskipun tidak ada teks.

Utas 1: Kesalahan fatal: Tiba-tiba ditemukan nihil saat membuka bungkus nilai Opsional

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
}

Saya bingung dan tidak yakin mengapa validasi tidak berhasil


person Andrew    schedule 25.04.2020    source sumber


Jawaban (3)


Sebuah string yang kosong tidak sama dengan nihil. Anda juga perlu memeriksa apakah stringnya kosong, atau cukup membuka karakter pertama nama depan dan belakang dengan aman:

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
}

Atau, jika Anda ingin melakukannya dengan cara yang lebih "Swiftyâ„¢" (dan jika Anda setuju dengan membuat string yang tidak kosong untuk kasus di mana hanya lastName yang disediakan ), maka Anda dapat melakukan ini:

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
Anda dapat membatalkan sarangnya dengan memulai size dan nol, dan menambahkan 36 ke dalamnya (hingga) dua kali. - person Alexander; 25.04.2020

Seperti yang dikatakan kesalahan:

Tiba-tiba ditemukan nihil saat membuka bungkus nilai Opsional

Artinya firstName != nil && lastName != nil tidak benar. Kesalahan yang Anda dapatkan ada di sini:

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

mungkin firstName juga nihil.

Anda dapat memeriksa string seperti ini firstName .isEmpty. Ia memeriksa nihil dan "" (string kosong).

person Diogo Nunes    schedule 25.04.2020

Anda juga bisa menggunakan pernyataan switch seperti ini, sehingga Anda memiliki kontrol lebih besar atas apa yang terjadi:

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
}

Dan postingan ini agak lama, tetapi ini menjelaskan mengapa Anda dapat menggunakan case .some pada opsional, karena ini adalah enum.

Swift: menguji terhadap nilai opsional dalam switch case

person NicolasElPapu    schedule 25.04.2020