Noop cho các tuyên bố chuyển đổi hoàn toàn của Swift


88

Swift yêu cầu các câu lệnh chuyển đổi đầy đủ và mỗi trường hợp đều có mã thực thi.

nhãn 'case' trong 'switch' phải có ít nhất một câu lệnh thực thi

Có ai đã giải quyết một cách tốt để xử lý các trường hợp mà bạn không muốn thực sự làm bất cứ điều gì không? Tôi có thể đặt println () vào đó, nhưng điều đó cảm thấy bẩn.


Câu trả lời:


150

Theo cuốn sách , bạn cần sử dụng breakở đó:

Không được để trống phạm vi của mỗi trường hợp. Do đó, bạn phải bao gồm ít nhất một câu lệnh sau dấu hai chấm (:) của mỗi nhãn trường hợp. Sử dụng một breakcâu lệnh duy nhất nếu bạn không có ý định thực thi bất kỳ mã nào trong phần thân của một trường hợp phù hợp.


8
Oh, một lần nữa Swift phá vỡ quy luật tối thiểu ngạc nhiên :)
Sulthan

10
@Jiaaro Sự cần thiết breakchỉ ra rằng các nhánh không breakcó có thể lọt qua.
RnMss

4
Một ()wokrs đơn giản , quá. Tuy nhiên, tôi thích breakvì nó làm cho mọi thứ rõ ràng hơn. Sử dụng từ khóa fallthrougđể xem xét các câu lệnh.
cLar

1
Điều này khá khó chịu khi bạn muốn nhận xét ngắn gọn dòng duy nhất trong default:trường hợp. Đó dường như không phải là một điều tốt. Tôi cũng đồng ý rằng nó gợi ý đến hành vi của c, đó không phải là những gì Swift làm (rất vui khi biết nó có thể vượt qua).
Benjohn

1
Và tôi đã đến đây chỉ để chắc chắn rằng giờ nghỉ sẽ không bỏ một vòng lặp kèm theo đầu ..
JulianSymes

12

Bạn có thể sử dụng một breakcâu lệnh:

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."
}

Ví dụ được sửa đổi từ tài liệu


3

Dưới đây là một tùy chọn cho câu lệnh null, nhưng có thể không phải là một giải pháp tốt. Tôi không thể tìm thấy một câu lệnh như python pass

{}() 

đối với trường hợp chuyển mạch, ngắt là lựa chọn tốt hơn.

break

0

Giải pháp rõ ràng nhất mà tôi đã tìm thấy là chỉ cần đưa câu lệnh cuối cùng của bạn vào trường hợp chuyển đổi làm mặc định của bạn. Điều này tránh phải thêm breakhoặc các câu lệnh không cần thiết khác trong khi vẫn bao gồm tất cả các trường hợp có thể xảy ra.

Ví dụ:

switch myVar {

case 0:
    myOtherVar = "Red"

case 1:
    myOtherVar = "Blue"

default:
    myOtherVar = "Green"

}

1
Xin chào @scottyhardy. Đây thực sự không phải là điểm của câu hỏi. Bạn đã viết câu trả lời cho câu hỏi: "Làm thế nào để tránh phải thêm một trường hợp mặc định trống" (hoặc một cái gì đó dọc theo những dòng đó). Trong trường hợp của bạn, bạn thực sự đang làm điều gì đó trong tất cả các trường hợp. Nhưng giả sử bạn gặp trường hợp (như trường hợp số 2 chẳng hạn) mà bạn không muốn làm bất cứ điều gì, thì trong trường hợp đó bạn quay lại câu hỏi tương tự: phải làm gì khi trong trường hợp chuyển đổi mà chúng ta không muốn để làm gì? Truyện dài: ngắt nghỉ.
Enricoza

0

Ngoài việc breakđược đề cập trong các câu trả lời khác, tôi cũng đã thấy ()được sử dụng như một tuyên bố không chọn:

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

Sử dụng ()nếu bạn thấy breakkhó hiểu hoặc muốn lưu 3 ký tự.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.