การจัดการที่รวดเร็วไม่มีเลย [ซ้ำกัน]

ฉันยังใหม่กับ 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
}

ฉันสับสนและไม่แน่ใจว่าเหตุใดการตรวจสอบจึงไม่ทำงาน


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

ตามที่ข้อผิดพลาดบอกว่า:

พบศูนย์โดยไม่คาดคิดขณะแกะค่าเผื่อเลือก

ความหมายก็คือ firstName != nil && LastName != nil ไม่เป็นความจริง ข้อผิดพลาดที่คุณได้รับอยู่ที่นี่:

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

อาจเป็น firstName ก็เป็นศูนย์เช่นกัน

คุณสามารถตรวจสอบสตริงลักษณะนี้ firstName .isEmpty จะตรวจสอบค่าศูนย์และ "" (สตริงว่าง)

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 กับตัวเลือกเสริมได้ เนื่องจากเป็น enums

Swift: การทดสอบกับค่าเสริมในกรณีสวิตช์

person NicolasElPapu    schedule 25.04.2020