Trang trí biến nhanh với “?” (dấu chấm hỏi) và “!” (dấu chấm than)


106

Tôi hiểu rằng trong Swift, tất cả các biến phải được đặt bằng một giá trị và bằng cách sử dụng các tùy chọn, chúng ta có thể đặt một biến được đặt thành nilban đầu.

Điều tôi không hiểu là, cài đặt biến với a !đang làm gì, bởi vì tôi có ấn tượng rằng điều này "mở ra" một giá trị từ một tùy chọn. Tôi nghĩ khi làm như vậy, bạn đang đảm bảo rằng có một giá trị để mở trong biến đó, đó là lý do tại sao trên IBActions và bạn thấy nó được sử dụng.

Nói một cách đơn giản, biến sẽ được khởi tạo khi bạn làm điều gì đó như sau:

var aShape : CAShapeLayer!

Và tại sao / khi nào tôi sẽ làm điều này?


Bạn sẽ làm điều này để cho biết rằng một biến là số không sau khi bạn kiểm tra thực tế này.
Matthias

Tôi không nghĩ điều này nên được đánh dấu là trùng lặp. "Tùy chọn là gì?" không phải là câu hỏi giống như "Sự khác biệt giữa hai loại tùy chọn là gì?" đó là khá nhiều những gì này câu hỏi là
Jiaaro

@Jiaaro ngay cả trong trường hợp đó, đã có rất nhiều câu hỏi liên quan đến các tùy chọn, tùy chọn không được gói ngầm và những thứ tương tự. Bạn cũng có thể tham khảo cái này: stackoverflow.com/questions/24272781/…
Jack

@JackWu Ok, nhưng tôi khá chắc rằng câu hỏi này không trùng lặp khi nó được hỏi. (Ví dụ: nó đã được hỏi một tuần trước khi ví dụ của bạn)
Jiaaro

@Jiaaro Bạn làm cho một điểm tốt, tôi không nhận thấy điều này là older..maybe rằng một khác nên được đánh dấu như một bản sao của một trong này để thay thế ..
Jack

Câu trả lời:


145

Trong một khai báo kiểu, !tương tự như ?. Cả hai đều là một tùy chọn, nhưng !là một tùy chọn "được mở ra hoàn toàn" , có nghĩa là bạn không cần phải mở nó ra để truy cập giá trị (nhưng nó vẫn có thể là nil).

Về cơ bản đây là hành vi mà chúng ta đã có trong mục tiêu-c. Một giá trị có thể là nil và bạn phải kiểm tra nó, nhưng bạn cũng có thể truy cập trực tiếp vào giá trị đó như thể nó không phải là một tùy chọn (với sự khác biệt quan trọng là nếu bạn không kiểm tra nil, bạn sẽ nhận được lỗi runtime)

// Cannot be nil
var x: Int = 1

// The type here is not "Int", it's "Optional Int"
var y: Int? = 2

// The type here is "Implicitly Unwrapped Optional Int"
var z: Int! = 3

Sử dụng:

// you can add x and z
x + z == 4

// ...but not x and y, because y needs to be unwrapped
x + y // error

// to add x and y you need to do:
x + y!

// but you *should* do this:
if let y_val = y {
    x + y_val
}

7
Các tùy chọn không được bao bọc hoàn toàn được mô tả trong một phần được đặt tên phù hợp bắt đầu từ trang 56 của Ngôn ngữ lập trình Swift .
Caleb

@Caleb Tôi đã thêm một liên kết đến các phần có liên quan của các tài liệu trực tuyến, nơi tôi đã đề cập ngầm optionals quà nào :)
Jiaaro

Thông tin tuyệt vời, cảm ơn. Nói chung yêu thích sự an toàn mà Swift đang tạo ra cho chúng ta cho đến nay, nên tạo ra ít lỗi hơn rất nhiều :).
Jason Renaldo

@Jiaaro: Cảm ơn bạn rất nhiều vì đã chia sẻ. Nó làm cho người dùng hiểu Hoàn hảo bằng ví dụ trên. !! :)
Esha

3
Tôi nghĩ câu " Về cơ bản đây là hành vi mà chúng ta đã có trong mục tiêu-c " có thể gây nhầm lẫn. Trong mục tiêu-c, người ta có thể truy cập một nilgiá trị và thực sự "làm việc" với nó, khi truy cập nhanh vào một tùy chọn không được bao bọc ngầm trong khi nó không có sẽ ném ra một ngoại lệ thời gian chạy.
Sascha Wolf
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.