Swift đặt một phí bảo hiểm cao về loại an toàn. Toàn bộ ngôn ngữ Swift được thiết kế với tâm trí an toàn. Đó là một trong những đặc điểm nổi bật của Swift và là một trong những điều bạn nên chào đón với vòng tay rộng mở. Nó sẽ hỗ trợ phát triển mã sạch, dễ đọc và giúp ứng dụng của bạn không bị sập.
Tất cả các tùy chọn trong Swift được phân định với ?
biểu tượng. Bằng cách đặt tên ?
sau của loại mà bạn đang khai báo là tùy chọn, về cơ bản bạn sẽ chọn loại này không phải là loại nằm trước ?
, mà thay vào đó là loại tùy chọn .
Lưu ý: Một biến hoặc loại Int
là không giống như Int?
. Chúng là hai loại khác nhau không thể được vận hành lẫn nhau.
Sử dụng tùy chọn
var myString: String?
myString = "foobar"
Điều này không có nghĩa là bạn đang làm việc với một loại String
. Điều này có nghĩa là bạn đang làm việc với một loại String?
(Chuỗi tùy chọn hoặc Chuỗi tùy chọn). Trong thực tế, bất cứ khi nào bạn cố gắng để
print(myString)
tại thời gian chạy, bàn điều khiển gỡ lỗi sẽ in Optional("foobar")
. Phần " Optional()
" chỉ ra rằng biến này có thể có hoặc không có giá trị khi chạy, nhưng thực tế là hiện tại có chứa chuỗi "foobar". "Đây Optional()
" dấu hiệu sẽ vẫn trừ khi bạn làm những gì được gọi là "unwrapping" giá trị bắt buộc.
Unwrapping một tùy chọn có nghĩa là bạn hiện đang chọn loại đó là không tùy chọn. Điều này sẽ tạo ra một loại mới và gán giá trị nằm trong tùy chọn đó cho loại không tùy chọn mới. Bằng cách này, bạn có thể thực hiện các thao tác trên biến đó vì nó đã được trình biên dịch đảm bảo có giá trị vững chắc.
Unwrapping có điều kiện sẽ kiểm tra xem giá trị trong tùy chọn có nil
hay không. Nếu nó không phải là nil
, sẽ có một biến cố mới được tạo ra sẽ được gán giá trị và quà nào vào hằng số không bắt buộc. Và từ đó bạn có thể sử dụng một cách không an toàn trong if
khối.
Lưu ý: Bạn có thể đặt tên không đổi có điều kiện cùng tên với biến tùy chọn mà bạn đang hủy ghép.
if let myString = myString {
print(myString)
// will print "foobar"
}
Tùy chọn hủy ghép có điều kiện là cách sạch nhất để truy cập giá trị của tùy chọn vì nếu nó chứa giá trị không thì mọi thứ trong khối if let sẽ không thực thi. Tất nhiên, giống như bất kỳ câu lệnh if nào, bạn có thể bao gồm một khối khác
if let myString = myString {
print(myString)
// will print "foobar"
}
else {
print("No value")
}
Buộc Unwrapping được thực hiện bằng cách sử dụng toán tử được gọi là toán tử !
("bang"). Điều này ít an toàn hơn nhưng vẫn cho phép mã của bạn biên dịch. Tuy nhiên, bất cứ khi nào bạn sử dụng toán tử bang, bạn phải chắc chắn 1000% rằng biến của bạn thực tế có chứa một giá trị vững chắc trước khi buộc phải hủy bỏ.
var myString: String?
myString = "foobar"
print(myString!)
Đây là mã Swift hoàn toàn hợp lệ. Nó in ra giá trị của myString
cái đó được đặt là "foobar". Người dùng sẽ thấy foobar
được in trong bảng điều khiển và đó là về nó. Nhưng hãy giả sử giá trị không bao giờ được đặt:
var myString: String?
print(myString!)
Bây giờ chúng tôi có một tình huống khác nhau trên tay của chúng tôi. Không giống như Objective-C, bất cứ khi nào một nỗ lực được thực hiện để buộc mở khóa tùy chọn và tùy chọn chưa được đặt và nil
khi bạn cố gắng mở khóa tùy chọn để xem những gì bên trong ứng dụng của bạn sẽ gặp sự cố.
Unwrapping w / Kiểu đúc . Như chúng tôi đã nói trước đó, trong khi bạn là unwrapping
tùy chọn, bạn thực sự đang chuyển sang loại không tùy chọn, bạn cũng có thể chuyển từ không tùy chọn sang loại khác. Ví dụ:
var something: Any?
Ở đâu đó trong mã của chúng tôi, biến something
sẽ được đặt với một số giá trị. Có thể chúng ta đang sử dụng thuốc generic hoặc có thể có một số logic khác đang diễn ra sẽ khiến điều này thay đổi. Vì vậy, sau này trong mã của chúng tôi, chúng tôi muốn sử dụng something
nhưng vẫn có thể xử lý nó khác nếu nó là một loại khác. Trong trường hợp này, bạn sẽ muốn sử dụng as
từ khóa để xác định điều này:
Lưu ý: as
Toán tử là cách bạn nhập cast trong Swift.
// Conditionally
if let thing = something as? Int {
print(thing) // 0
}
// Optionally
let thing = something as? Int
print(thing) // Optional(0)
// Forcibly
let thing = something as! Int
print(thing) // 0, if no exception is raised
Lưu ý sự khác biệt giữa hai as
từ khóa. Giống như trước đây khi chúng tôi buộc phải hủy một tùy chọn, chúng tôi đã sử dụng !
toán tử bang để làm như vậy. Ở đây bạn sẽ làm điều tương tự nhưng thay vì chỉ chọn không phải là tùy chọn, bạn cũng sẽ chọn nó Int
. Và nó phải có khả năng bị hạ thấp vì Int
nếu không, như sử dụng toán tử bang khi giá trị là nil
ứng dụng của bạn sẽ bị sập.
Và để sử dụng tất cả các biến này trong một số hoạt động sắp xếp hoặc toán học, chúng phải được mở ra để làm như vậy.
Chẳng hạn, trong Swift chỉ các loại dữ liệu số hợp lệ cùng loại có thể được vận hành lẫn nhau. Khi bạn sử dụng một loại với loại as!
bạn đang buộc downcast của biến đó như thể bạn chắc chắn đó là loại đó, do đó an toàn để hoạt động và không làm hỏng ứng dụng của bạn. Điều này là ổn miễn là biến thực sự thuộc loại bạn đang sử dụng, nếu không bạn sẽ có một mớ hỗn độn trên tay.
Tuy nhiên, việc truyền với as!
sẽ cho phép mã của bạn biên dịch. Bằng cách đúc với một as?
là một câu chuyện khác nhau. Trong thực tế, as?
khai báo của bạn Int
là một loại dữ liệu hoàn toàn khác nhau cùng nhau.
Bây giờ thì đúng là vậy Optional(0)
Và nếu bạn đã từng cố gắng làm bài tập về nhà của mình bằng cách viết
1 + Optional(1) = 2
Giáo viên toán của bạn có thể đã cho bạn một "F". Tương tự với Swift. Ngoại trừ Swift thà không biên dịch gì cả hơn là cho bạn điểm. Bởi vì vào cuối ngày, tùy chọn trên thực tế có thể là con số không .
An toàn cho trẻ em đầu tiên.