Swift: Loại lớp kiểm tra trong câu lệnh switch


207

Trong Swift, bạn có thể kiểm tra loại lớp của một đối tượng bằng cách sử dụng 'là'. Làm cách nào tôi có thể kết hợp điều này vào khối 'chuyển đổi'?

Tôi nghĩ điều đó là không thể, vì vậy tôi tự hỏi đâu là cách tốt nhất để giải quyết vấn đề này.

Câu trả lời:


436

Bạn hoàn toàn có thể sử dụng istrong một switchkhối. Xem "Nhập kiểu cho bất kỳ và AnyObject" trong Ngôn ngữ lập trình Swift (mặc dù tất nhiên nó không bị giới hạn Any). Họ có một ví dụ rộng rãi:

for thing in things {
    switch thing {
    case 0 as Int:
        println("zero as an Int")
    case 0 as Double:
        println("zero as a Double")
    case let someInt as Int:
        println("an integer value of \(someInt)")
    case let someDouble as Double where someDouble > 0:
        println("a positive double value of \(someDouble)")
// here it comes:
    case is Double:
        println("some other double value that I don't want to print")
    case let someString as String:
        println("a string value of \"\(someString)\"")
    case let (x, y) as (Double, Double):
        println("an (x, y) point at \(x), \(y)")
    case let movie as Movie:
        println("a movie called '\(movie.name)', dir. \(movie.director)")
    default:
        println("something else")
    }
}

2
Chào cướp. Chỉ tò mò: vì chúng tôi không sử dụng thingtrong switch` trong bất kỳ điều nào caseở trên, nên sử dụng ở đây là thinggì? Tôi đã không nhìn thấy nó. Cảm ơn.
Unheilig

3
điều là giá trị đang được thử nghiệm trong từng trường hợp. Vì vậy, nếu thứ đó là Phim, giá trị của nó sẽ bị ràng buộc với phim biểu tượng.
Rob Napier

5
"Bạn hoàn toàn có thể sử dụng is" - và sau đó anh ta không bao giờ sử dụng nó. X)
Raphael

3
@Raphael Tôi có thể thấy case is Doubletrong câu trả lời
Gobe

2
@Gobe xấu của tôi, bỏ lỡ nó. :> Lý do của tôi: có lẽ đó không phải là ví dụ minh họa nhất?
Raphael

46

Đưa ra ví dụ cho hoạt động "case is - case là Int, là String: ", trong đó nhiều trường hợp có thể được sử dụng kết hợp với nhau để thực hiện cùng một hoạt động cho các loại Đối tượng tương tự. Ở đây "," tách các loại trong trường hợp đang hoạt động như toán tử OR .

switch value{
case is Int, is String:
    if value is Int{
        print("Integer::\(value)")
    }else{
        print("String::\(value)")
    }
default:
    print("\(value)")
}

Liên kết demo


11
đặt hai trường hợp lại với nhau chỉ để phân tách chúng qua ifcó lẽ không phải là ví dụ tốt nhất để chứng minh quan điểm của bạn.
cảnh báo

1
Nó có lẽ sẽ tốt hơn nếu valuelà cái gì đó có thể là một trong những Int, Float, Double, và điều trị FloatDoubletheo cùng một cách.
noamtm

30

Trong trường hợp bạn không có giá trị, chỉ cần bất kỳ đối tượng nào:

nhanh 4

func test(_ val:Any) {
    switch val {
    case is NSString:
        print("it is NSString")
    case is String:
        print("it is a String")
    case is Int:
        print("it is int")
    default:
        print(val)
    }
}


let str: NSString = "some nsstring value"
let i:Int=1
test(str) 
// it is NSString
test(i) 
// it is int

17

Tôi thích cú pháp này:

switch thing {
case _ as Int: print("thing is Int")
case _ as Double: print("thing is Double")
}

vì nó cung cấp cho bạn khả năng mở rộng chức năng nhanh chóng, như thế này:

switch thing {
case let myInt as Int: print("\(myInt) is Int")
case _ as Double: print("thing is Double")
}
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.