Noop สำหรับคำสั่ง Exhaustive Switch ของ Swift


90

Swift ต้องใช้คำสั่ง switch ที่ละเอียดถี่ถ้วนและแต่ละกรณีมีรหัสปฏิบัติการ

ป้ายกำกับ 'case' ใน 'switch' ควรมีอย่างน้อยหนึ่งคำสั่งที่เรียกใช้งานได้

มีใครตัดสินวิธีจัดการกรณีที่คุณไม่ต้องการทำอะไรได้ดีบ้าง? ฉันสามารถใส่ println () ไว้ในนั้นได้ แต่รู้สึกว่าสกปรก


คำตอบ:


151

ตามหนังสือคุณต้องใช้ที่breakนั่น:

ขอบเขตของแต่ละกรณีต้องไม่ว่างเปล่า ด้วยเหตุนี้คุณต้องรวมคำสั่งอย่างน้อยหนึ่งคำสั่งตามเครื่องหมายจุดคู่ (:) ของป้ายกำกับแต่ละกรณี ใช้breakคำสั่งเดียวหากคุณไม่ต้องการรันโค้ดใด ๆ ในเนื้อความของกรณีที่ตรงกัน


8
โอ้อีกครั้ง Swift ฝ่าฝืนกฎแห่งความประหลาดใจขั้นต่ำ :)
Sulthan

10
@Jiaaro ความจำเป็นในการbreakบ่งชี้ว่ากิ่งก้านโดยไม่breakอาจล้มลง
RnMss

4
()wokrs ง่ายๆด้วย อย่างไรก็ตามฉันชอบbreakเพราะมันทำให้สิ่งต่างๆชัดเจนมากขึ้น ใช้คีย์เวิร์ดfallthrougเพื่อล้มงบ
cLar

1
สิ่งนี้ค่อนข้างน่ารำคาญเมื่อคุณต้องการแสดงความคิดเห็นสั้น ๆ ในบรรทัดเดียวที่อยู่ในdefault:กรณีนี้ นั่นดูเหมือนจะไม่ใช่เรื่องดี ฉันยอมรับด้วยว่ามันเป็นการชี้นำถึงพฤติกรรมการตกของ c ซึ่งไม่ใช่สิ่งที่ Swift ทำ (ยินดีที่รู้ว่ามันสามารถผ่านได้)
Benjohn

1
และฉันต้องมาที่นี่เพื่อให้แน่ใจว่าการหยุดพักจะไม่ออกจากวงปิดก่อนเวลา ..
JulianSymes

12

คุณสามารถใช้breakคำสั่ง:

let vegetable = "red pepper"
var vegetableComment: String = "Nothing"
switch vegetable {
case "cucumber", "watercress":
    break // does nothing
case let x where x.hasSuffix("pepper"):
    vegetableComment = "Is it a spicy \(x)?"
default:
    vegetableComment = "Everything tastes good in soup."
}

ตัวอย่างที่แก้ไขจากเอกสาร


3

ด้านล่างนี้เป็นทางเลือกหนึ่งสำหรับคำสั่ง null แต่อาจไม่ใช่วิธีแก้ปัญหาที่ดี ฉันไม่พบคำสั่งเช่น python pass

{}() 

สำหรับกรณีสวิตช์การแบ่งเป็นทางเลือกที่ดีกว่า

break

1

นอกเหนือจากที่breakกล่าวไว้ในคำตอบอื่น ๆ แล้วฉันยังเห็นว่า()ใช้เป็นคำสั่ง no-op:

switch 0 == 1 {
case true:
    break
case false:
    ()
}

ใช้()หากคุณพบว่าbreakสับสนหรือต้องการบันทึก 3 อักขระ


0

วิธีแก้ปัญหาที่สะอาดที่สุดที่ฉันพบคือเพียงรวมคำสั่งสุดท้ายของคุณในกรณีสวิตช์เป็นค่าเริ่มต้นของคุณ เพื่อหลีกเลี่ยงความจำเป็นในการเพิ่มbreakหรือข้อความที่ไม่จำเป็นอื่น ๆ ในขณะที่ยังครอบคลุมทุกกรณีที่เป็นไปได้

ตัวอย่างเช่น:

switch myVar {

case 0:
    myOtherVar = "Red"

case 1:
    myOtherVar = "Blue"

default:
    myOtherVar = "Green"

}

1
สวัสดี @scottyhardy นี่ไม่ใช่ประเด็นของคำถามจริงๆ คุณเขียนคำตอบสำหรับคำถาม: "วิธีหลีกเลี่ยงการเพิ่มกรณีเริ่มต้นที่ว่างเปล่า" (หรือบางอย่างตามบรรทัดเหล่านั้น) ในกรณีของคุณคุณกำลังทำอะไรบางอย่างในทุกกรณี แต่สมมติว่าคุณมีกรณี (เช่นหมายเลข 2 เป็นต้น) ที่คุณไม่ต้องการทำอะไรในกรณีนั้นคุณจะกลับมาที่คำถามเดิม: จะทำอย่างไรเมื่ออยู่ในกรณีสวิตช์ที่เราไม่ต้องการ จะทำอะไร? เรื่องสั้นขนาดยาว: ใช้ช่วงพัก
Enricoza

0

ไม่ต้องทำอะไรเลยในคำสั่งกรณีสวิตช์โดยละเอียด

รวดเร็ว:

switch yourVariable {
case .someCase:
    break
}

SwiftUI:

switch yourVariable {
case .someCase:
    EmptyView() // break does not work with ViewBuilder
}

การใช้ EmptyView () แทนการหยุดในมุมมอง SwiftUI ป้องกันข้อผิดพลาด:

ไม่สามารถใช้การปิดที่มีคำสั่งโฟลว์ควบคุมกับตัวสร้างฟังก์ชัน ViewBuilder

EmptyView () เป็นมุมมองมาตรฐานของ SwiftUI (ทดสอบด้วย Xcode 12, iOS 14) และไม่จำเป็นต้องกำหนดเอง


0

คุณสามารถตรวจสอบกรณีเฉพาะไม่จำเป็นต้องอยู่exhustiveกับswitch cases

สมมติว่าคุณมี enum แบบนี้

enum Selection {
        case one
        case two
        case three
    }
var myCase = Selection.one
    

คุณสามารถตรวจสอบเช่นนี้

    if case .one = myCase {
        print("one")
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.