2015-07-16 15 views
6

mẫu tùy chọn Swift cho phép bạn sử dụng trường hợp chúng ta hãy như thế này:Patterns Tùy chọn Swift

var arrayOfOptional: [Int?] = [1, 2, nil, 4] 

for case let number? in arrayOfOptional { 
    print("\(number)") 
} 

gì confuses me là số let? cú pháp. Trong ràng buộc tùy chọn, phiên bản chưa được mở không có ?, nhưng trong trường hợp cho phép, nó có. Làm thế nào để bạn giải thích cấu trúc này cho nó để làm cho tinh thần cho bạn rằng số đó là unwrapped?

Về mặt chức năng, sự khác biệt giữa hai bên dưới là những gì:

if let x = someOptional { 
    print(x) 
} 

so

if case let x? = someOptional { 
    print(x) 
} 
+0

'x?' Chỉ là một lối tắt cho '.Some (x)' trong một mẫu (như được ghi trong [Mẫu tùy chọn] (https://developer.apple.com/library/ prerelease/ios/documentation/Swift/Khái niệm/Swift_Programming_Language/Patterns.html # // apple_ref/doc/uid/TP40014097-CH36-ID520)). Là câu hỏi của bạn * tại sao * Apple đã chọn cú pháp cụ thể này? (Tôi nghĩ rằng nó đã được thảo luận trong Diễn đàn Nhà phát triển của Apple cho dù điều này là trực quan hay không.) –

+0

Cú pháp này là đối diện của ràng buộc tùy chọn, mà unwraps mà không có bạn chỉ định ?, Cố gắng tìm cách để giải thích điều này theo cách mà tôi có thể nhớ hành vi dễ dàng hơn. Ngoài ra, cho rằng đây là một phím tắt cho. Một số (x), nếu bạn làm thẳng x mà không có? (ví dụ: nếu trường hợp cho x) - bản đồ đó là gì? – Boon

+1

'nếu trường hợp để x = y {}' là khá vô ích. Nó luôn luôn đúng và gán 'y' cho' x'. Nhưng 'nếu case cho x là SubClass = y {}' là hàm tương đương với 'if let x = y as? SubClass {} '. - Các mẫu tùy chọn tổng quát hơn so với ràng buộc tùy chọn, chúng có thể được sử dụng trong chuyển đổi/if/while/for statements và cú pháp chỉ khác (và có lẽ không trực quan). –

Trả lời

1

tôi chỉ kiểm tra mã đầu tiên của bạn, không bao giờ được sử dụng để mô hình phù hợp với trước đây nhưng đây là những gì tôi giả:

var arrayOfOptional: [Int?] = [1, 2, nil, 4] 

for case let number in arrayOfOptional { 
    print("\(number)") 
} 
// will return 3 optional ints and a nil 

for case let number? in arrayOfOptional { 
    print("\(number)") 
} 
// will return only any values that could be unwrapped 

Tôi giả định rằng đây là mẫu không có bất kỳ giá trị tùy chọn nào dưới mui xe và chỉ tiến hành nếu nó có thể được unwrapped và sẽ.

if case let x? = someOptional { 
    print(x) 
} 

case let được sử dụng để đối sánh mẫu như switch x { case let ... }. Trong ví dụ của bạn, nó cũng sẽ cố gắng gỡ bỏ một giá trị tùy chọn. Nếu đó là số không, nó sẽ thất bại

+0

Đúng - và tôi thấy mô hình này khó hiểu, về cơ bản là thêm vào? ngược lại không có nó (đặc biệt là khi so sánh với ràng buộc tùy chọn). Đang cố tìm cách giải thích điều này để tôi có thể nhớ tốt hơn. – Boon

+0

Điều này cũng thực sự tiện dụng (Swift 2.0): 'guard instance.dynamicType là AnyClass else {/ * không phải là kiểu cấu trúc, làm gì đó ở đây * /}' Nhưng nó bị lỗi. Điều này sẽ chỉ đúng nếu trường hợp của bạn là một lớp nếu không nó sẽ thất bại. Và nó sẽ bỏ qua cầu nối tới ObjC. Kinda tốt đẹp để biết. – DevAndArtist

+0

Sẽ tốt hơn nếu viết nó là 'if case .Some (let x) = someOptional {' vì dễ hiểu hơn. Sử dụng 'cho trường hợp. Một số (để số) trong mảngOfOptional' cho vòng lặp for-in. – vacawama

Các vấn đề liên quan