Swift là ngôn ngữ lập trình mới để phát triển ứng dụng iOS, macOS, watchOS và tvOS. Tuy nhiên, nhiều phần của Swift sẽ quen thuộc với kinh nghiệm phát triển của bạn trong C và Objective-C
Swift cung cấp các phiên bản riêng của tất cả các loại C và Objective-C cơ bản, bao gồm Int
cho số nguyên, Double
và Float
cho giá trị dấu phẩy động, Bool
cho giá trị Boolean và String
cho dữ liệu văn bản. Swift cũng cung cấp các phiên bản mạnh mẽ của ba loại bộ sưu tập chính, Array
, Set
và Dictionary
, như được mô tả trong Các loại bộ sưu tập .
Giống như C, Swift sử dụng các biến để lưu trữ và tham chiếu đến các giá trị bằng một tên xác định. Swift cũng sử dụng rộng rãi các biến có giá trị không thể thay đổi. Chúng được gọi là hằng số và mạnh hơn nhiều so với hằng số trong C. Các hằng số được sử dụng xuyên suốt Swift để làm cho mã an toàn hơn và rõ ràng hơn khi bạn làm việc với các giá trị không cần thay đổi
Ngoài các kiểu quen thuộc, Swift giới thiệu các kiểu nâng cao không có trong Objective-C, chẳng hạn như bộ dữ liệu. Bộ dữ liệu cho phép bạn tạo và chuyển qua các nhóm giá trị. Bạn có thể sử dụng một bộ để trả về nhiều giá trị từ một hàm dưới dạng một giá trị phức hợp duy nhất
Swift cũng giới thiệu các loại tùy chọn, xử lý việc không có giá trị. Các tùy chọn cho biết "có một giá trị và nó bằng x" hoặc "không có giá trị nào cả". Sử dụng tùy chọn tương tự như sử dụng nil
với con trỏ trong Mục tiêu-C, nhưng chúng hoạt động với bất kỳ loại nào, không chỉ các lớp. Các tùy chọn không chỉ an toàn hơn và biểu cảm hơn so với các con trỏ nil
trong Mục tiêu-C, chúng còn là trung tâm của nhiều tính năng mạnh mẽ nhất của Swift
Swift là một ngôn ngữ an toàn về kiểu, có nghĩa là ngôn ngữ này giúp bạn hiểu rõ về các loại giá trị mà mã của bạn có thể làm việc với. Nếu một phần mã của bạn yêu cầu một String
, loại an toàn ngăn bạn vượt qua nó một Int
do nhầm lẫn. Tương tự như vậy, an toàn loại ngăn bạn vô tình chuyển một String
tùy chọn sang một đoạn mã yêu cầu một String
không tùy chọn. Loại an toàn giúp bạn phát hiện và sửa lỗi sớm nhất có thể trong quá trình phát triển
Hằng và biến
Các hằng số và biến liên kết một tên [chẳng hạn như Double
4 hoặc Double
5] với một giá trị của một loại cụ thể [chẳng hạn như số Double
6 hoặc chuỗi Double
7]. Giá trị của một hằng số không thể thay đổi sau khi nó được đặt, trong khi một biến có thể được đặt thành một giá trị khác trong tương lai
Khai báo hằng và biến
Hằng và biến phải được khai báo trước khi sử dụng. Bạn khai báo hằng với từ khóa Double
8 và biến với từ khóa Double
9. Dưới đây là ví dụ về cách có thể sử dụng các hằng số và biến để theo dõi số lần thử đăng nhập mà người dùng đã thực hiện
- let số lần đăng nhập tối đa = 10
- var currentLoginAttempt = 0
Mã này có thể được đọc là
“Khai báo một hằng số mới có tên là Double
4 và đặt cho nó một giá trị là Double
6. Sau đó, khai báo một biến mới có tên là Float
2 và đặt cho nó giá trị ban đầu là Float
3. ”
Trong ví dụ này, số lần thử đăng nhập được phép tối đa được khai báo là một hằng số vì giá trị tối đa không bao giờ thay đổi. Bộ đếm số lần đăng nhập hiện tại được khai báo là một biến, vì giá trị này phải được tăng lên sau mỗi lần đăng nhập không thành công
Bạn có thể khai báo nhiều hằng hoặc nhiều biến trên một dòng, cách nhau bởi dấu phẩy
- var x = 0. 0 , y = 0. 0 , z = 0. 0
Ghi chú
Nếu giá trị được lưu trữ trong mã của bạn không thay đổi, hãy luôn khai báo giá trị đó là hằng số với từ khóa Double
8. Chỉ sử dụng các biến để lưu trữ các giá trị cần có khả năng thay đổi
Loại chú thích
Bạn có thể cung cấp chú thích kiểu khi khai báo một hằng hoặc biến, để hiểu rõ về loại giá trị mà hằng hoặc biến có thể lưu trữ. Viết chú thích kiểu bằng cách đặt dấu hai chấm sau tên hằng hoặc tên biến, theo sau là khoảng trắng, sau đó là tên của kiểu sẽ sử dụng
Ví dụ này cung cấp một chú thích kiểu cho một biến có tên là Double
5, để chỉ ra rằng biến đó có thể lưu trữ các giá trị String
- var tin nhắn chào mừng . Chuỗi
Dấu hai chấm trong phần khai báo có nghĩa là “…loại…,” vì vậy đoạn mã trên có thể được đọc là
“Khai báo một biến có tên là Double
5 có kiểu là String
. ”
Cụm từ “thuộc loại String
” có nghĩa là “có thể lưu trữ bất kỳ giá trị String
nào. ” Hãy nghĩ nó có nghĩa là “loại đồ vật” [hoặc “loại đồ vật”] có thể được lưu trữ
Biến Double
5 hiện có thể được đặt thành bất kỳ giá trị chuỗi nào mà không gặp lỗi
- welcomeMessage = "Xin chào"
Bạn có thể xác định nhiều biến liên quan cùng loại trên một dòng, được phân tách bằng dấu phẩy, với một chú thích loại duy nhất sau tên biến cuối cùng
- var đỏ , xanh , blue: Gấp đôi
Ghi chú
Rất hiếm khi bạn cần viết chú thích loại trong thực tế. Nếu bạn cung cấp một giá trị ban đầu cho một hằng số hoặc biến tại điểm mà nó được xác định, Swift hầu như luôn có thể suy ra loại được sử dụng cho hằng số hoặc biến đó, như được mô tả trong. Trong ví dụ về Double
5 ở trên, không có giá trị ban đầu nào được cung cấp và do đó, loại biến Double
5 được chỉ định bằng chú thích loại thay vì được suy ra từ giá trị ban đầu
Đặt tên cho hằng và biến
Tên hằng và tên biến có thể chứa hầu hết mọi ký tự, kể cả ký tự Unicode
- hãy π = 3. 14159
- let 你好 = "你好世界"
- let 🐶🐮 = "dogcow"
Tên hằng và tên biến không được chứa ký tự khoảng trắng, ký hiệu toán học, mũi tên, giá trị vô hướng Unicode sử dụng riêng hoặc ký tự vẽ đường và hộp. Họ cũng không thể bắt đầu bằng một số, mặc dù các số có thể được bao gồm ở nơi khác trong tên
Khi bạn đã khai báo một hằng số hoặc biến thuộc một loại nhất định, bạn không thể khai báo lại nó với cùng tên hoặc thay đổi nó để lưu trữ các giá trị thuộc một loại khác. Bạn cũng không thể thay đổi hằng thành biến hoặc biến thành hằng
Ghi chú
Nếu bạn cần đặt một hằng số hoặc biến có cùng tên với một từ khóa Swift dành riêng, hãy bao quanh từ khóa đó bằng các dấu gạch ngược [Bool
4] khi sử dụng từ khóa đó làm tên. Tuy nhiên, tránh sử dụng từ khóa làm tên trừ khi bạn hoàn toàn không có lựa chọn nào khác
Bạn có thể thay đổi giá trị của biến hiện có thành giá trị khác của loại tương thích. Trong ví dụ này, giá trị của Bool
5 được thay đổi từ Bool
6 thành Bool
7
- var thân thiệnChào mừng = "Xin chào. "
- thân thiệnChào mừng = "Bonjour. "
- // thân thiệnChào mừng giờ là "Bonjour. "
Không giống như biến, giá trị của hằng số không thể thay đổi sau khi nó được đặt. Cố gắng làm như vậy được thông báo là có lỗi khi mã của bạn được biên dịch
- let languageName = "Swift"
- languageName = "Swift++"
- // Đây là lỗi thời gian biên dịch. languageName không thể thay đổi
In Hằng và Biến
Bạn có thể in giá trị hiện tại của hằng hoặc biến bằng hàm Bool
8
- in [ chào mừng thân thiện ]
- // Bản in "Bonjour. "
Hàm Bool
8 là một hàm toàn cầu in một hoặc nhiều giá trị thành một đầu ra thích hợp. Ví dụ, trong Xcode, hàm Bool
8 in đầu ra của nó trong ngăn “bảng điều khiển” của Xcode. Tham số String
1 và String
2 có giá trị mặc định, vì vậy bạn có thể bỏ qua chúng khi gọi hàm này. Theo mặc định, hàm kết thúc dòng mà nó in bằng cách thêm dấu ngắt dòng. Để in một giá trị mà không ngắt dòng sau nó, hãy chuyển một chuỗi trống làm dấu kết thúc—ví dụ: String
3. Để biết thông tin về các tham số có giá trị mặc định, hãy xem
Swift sử dụng phép nội suy chuỗi để bao gồm tên của hằng hoặc biến làm trình giữ chỗ trong chuỗi dài hơn và để nhắc Swift thay thế bằng giá trị hiện tại của hằng hoặc biến đó. Gói tên trong ngoặc đơn và thoát nó bằng dấu gạch chéo ngược trước dấu ngoặc đơn mở
- print [ "Giá trị hiện tại của friendlyWelcome là \ [friendlyWelcome]"]
- // In ra "Giá trị hiện tại của thân thiệnWelcome là Bonjour. "
Ghi chú
Tất cả các tùy chọn bạn có thể sử dụng với phép nội suy chuỗi được mô tả trong
Bình luận
Sử dụng nhận xét để bao gồm văn bản không thể thực thi được trong mã của bạn, như một ghi chú hoặc lời nhắc nhở cho chính bạn. Nhận xét bị trình biên dịch Swift bỏ qua khi mã của bạn được biên dịch
Nhận xét trong Swift rất giống với nhận xét trong C. Nhận xét một dòng bắt đầu bằng hai dấu gạch chéo [String
4]
- // Đây là một bình luận
Nhận xét nhiều dòng bắt đầu bằng dấu gạch chéo lên trước, theo sau là dấu hoa thị [String
5] và kết thúc bằng dấu hoa thị, sau đó là dấu gạch chéo lên trước [String
6]
- /* Đây cũng là một chú thích
- nhưng được viết trên nhiều dòng. */
Không giống như chú thích nhiều dòng trong C, chú thích nhiều dòng trong Swift có thể được lồng vào bên trong chú thích nhiều dòng khác. Bạn viết các chú thích lồng nhau bằng cách bắt đầu một khối chú thích nhiều dòng và sau đó bắt đầu một chú thích nhiều dòng thứ hai trong khối đầu tiên. Khối thứ hai sau đó được đóng lại, tiếp theo là khối thứ nhất
- /* Đây là điểm bắt đầu của chú thích nhiều dòng đầu tiên
- /* Đây là chú thích nhiều dòng lồng nhau thứ hai. */
- Đây là phần cuối của bình luận nhiều dòng đầu tiên. */
Nhận xét nhiều dòng lồng nhau cho phép bạn nhận xét các khối mã lớn một cách nhanh chóng và dễ dàng, ngay cả khi mã đã chứa nhận xét nhiều dòng
dấu chấm phẩy
Không giống như nhiều ngôn ngữ khác, Swift không yêu cầu bạn viết dấu chấm phẩy [String
7] sau mỗi câu lệnh trong mã của bạn, mặc dù bạn có thể làm như vậy nếu muốn. Tuy nhiên, dấu chấm phẩy là bắt buộc nếu bạn muốn viết nhiều câu lệnh riêng biệt trên một dòng
- hãy mèo = "🐱" ; print[cat]
- // In ra "🐱"
số nguyên
Số nguyên là số nguyên không có thành phần phân số, chẳng hạn như String
8 và String
9. Số nguyên có dấu [dương, 0 hoặc âm] hoặc không dấu [dương hoặc 0]
Swift cung cấp số nguyên có dấu và không dấu ở dạng 8, 16, 32 và 64 bit. Các số nguyên này tuân theo quy ước đặt tên tương tự như C, trong đó số nguyên không dấu 8 bit thuộc loại Array
0 và số nguyên có dấu 32 bit thuộc loại Array
1. Giống như tất cả các kiểu trong Swift, các kiểu số nguyên này có tên được viết hoa
giới hạn số nguyên
Bạn có thể truy cập các giá trị tối thiểu và tối đa của từng loại số nguyên với các thuộc tính Array
2 và Array
3 của nó
- let minValue = UInt8 . min // minValue bằng 0 và thuộc loại UInt8
- let maxValue = UInt8 . max // maxValue bằng 255 và thuộc loại UInt8
Các giá trị của các thuộc tính này thuộc loại số có kích thước phù hợp [chẳng hạn như Array
0 trong ví dụ trên] và do đó có thể được sử dụng trong các biểu thức bên cạnh các giá trị khác cùng loại
số nguyên
Trong hầu hết các trường hợp, bạn không cần chọn kích thước số nguyên cụ thể để sử dụng trong mã của mình. Swift cung cấp một loại số nguyên bổ sung, Int
, có cùng kích thước với kích thước từ gốc của nền tảng hiện tại
Trên nền tảng 32-bit,
Int
có cùng kích thước vớiArray
1Trên nền tảng 64-bit,
Int
có cùng kích thước vớiArray
9
Trừ khi bạn cần làm việc với kích thước số nguyên cụ thể, hãy luôn sử dụng Int
cho các giá trị số nguyên trong mã của bạn. Điều này hỗ trợ tính nhất quán của mã và khả năng tương tác. Ngay cả trên nền tảng 32 bit, Int
có thể lưu trữ bất kỳ giá trị nào trong khoảng từ Set
2 đến Set
3 và đủ lớn cho nhiều phạm vi số nguyên
UInt
Swift cũng cung cấp một loại số nguyên không dấu, Set
4, có cùng kích thước với kích thước từ gốc của nền tảng hiện tại
Trên nền tảng 32-bit,
Set
4 có cùng kích thước vớiSet
6Trên nền tảng 64-bit,
Set
4 có cùng kích thước vớiSet
8
Ghi chú
Chỉ sử dụng Set
4 khi bạn đặc biệt cần một loại số nguyên không dấu có cùng kích thước với kích thước từ gốc của nền tảng. Nếu đây không phải là trường hợp, thì Int
được ưu tiên, ngay cả khi các giá trị được lưu trữ được biết là không âm. Việc sử dụng nhất quán Int
cho các giá trị số nguyên hỗ trợ khả năng tương tác mã, tránh nhu cầu chuyển đổi giữa các loại số khác nhau và phù hợp với suy luận loại số nguyên, như được mô tả trong
Số dấu phẩy động
Số dấu phẩy động là số có thành phần phân số, chẳng hạn như Dictionary
2, Dictionary
3 và Dictionary
4
Các loại dấu phẩy động có thể biểu thị phạm vi giá trị rộng hơn nhiều so với các loại số nguyên và có thể lưu trữ các số lớn hơn hoặc nhỏ hơn nhiều so với có thể được lưu trữ trong một Int
. Swift cung cấp hai loại số dấu phẩy động có dấu
Double
đại diện cho số dấu phẩy động 64 bitFloat
đại diện cho số dấu phẩy động 32 bit
Ghi chú
Double
có độ chính xác ít nhất là 15 chữ số thập phân, trong khi độ chính xác của Float
có thể ít nhất là 6 chữ số thập phân. Loại dấu phẩy động thích hợp để sử dụng tùy thuộc vào bản chất và phạm vi giá trị bạn cần làm việc với mã của mình. Trong những tình huống mà một trong hai loại sẽ phù hợp, thì Double
được ưu tiên
Loại an toàn và loại suy luận
Swift là ngôn ngữ an toàn kiểu. Ngôn ngữ an toàn loại khuyến khích bạn hiểu rõ về các loại giá trị mà mã của bạn có thể làm việc với. Nếu một phần mã của bạn yêu cầu một String
, thì bạn không thể chuyển nó thành một Int
do nhầm lẫn
Vì Swift là loại an toàn nên nó thực hiện kiểm tra loại khi biên dịch mã của bạn và đánh dấu mọi loại không khớp là lỗi. Điều này cho phép bạn phát hiện và sửa lỗi sớm nhất có thể trong quá trình phát triển
Kiểm tra kiểu giúp bạn tránh lỗi khi làm việc với các kiểu giá trị khác nhau. Tuy nhiên, điều này không có nghĩa là bạn phải chỉ định kiểu của mọi hằng và biến mà bạn khai báo. Nếu bạn không chỉ định loại giá trị mình cần, Swift sẽ sử dụng suy luận kiểu để tìm ra loại phù hợp. Suy luận kiểu cho phép trình biên dịch tự động suy ra kiểu của một biểu thức cụ thể khi nó biên dịch mã của bạn, chỉ bằng cách kiểm tra các giá trị bạn cung cấp
Do suy luận kiểu, Swift yêu cầu khai báo kiểu ít hơn nhiều so với các ngôn ngữ như C hoặc Objective-C. Các hằng số và biến vẫn được nhập rõ ràng, nhưng phần lớn công việc xác định loại của chúng đã được thực hiện cho bạn
Suy luận kiểu đặc biệt hữu ích khi bạn khai báo một hằng hoặc biến có giá trị ban đầu. Điều này thường được thực hiện bằng cách gán một giá trị theo nghĩa đen [hoặc theo nghĩa đen] cho hằng số hoặc biến tại thời điểm bạn khai báo nó. [Giá trị theo nghĩa đen là giá trị xuất hiện trực tiếp trong mã nguồn của bạn, chẳng hạn như String
8 và Dictionary
2 trong các ví dụ bên dưới. ]
Ví dụ: nếu bạn gán một giá trị bằng chữ là String
8 cho một hằng số mới mà không nói nó là loại gì, Swift sẽ suy ra rằng bạn muốn hằng số đó là một Int
, bởi vì bạn đã khởi tạo nó bằng một số trông giống như một số nguyên
- let meaningOfLife = 42
- // meaningOfLife được suy ra là kiểu Int
Tương tự như vậy, nếu bạn không chỉ định loại cho ký tự dấu chấm động, Swift sẽ suy ra rằng bạn muốn tạo một Double
- let pi = 3. 14159
- // pi được suy ra là kiểu Double
Swift luôn chọn Double
[chứ không phải Float
] khi suy ra loại số dấu phẩy động
Nếu bạn kết hợp các ký tự số nguyên và dấu phẩy động trong một biểu thức, một loại Double
sẽ được suy ra từ ngữ cảnh
- let anotherPi = 3 + 0.14159
- // AnotherPi cũng được suy ra là kiểu Double
Giá trị bằng chữ của nil
1 không có kiểu rõ ràng trong chính nó, và do đó, kiểu đầu ra phù hợp của Double
được suy ra từ sự hiện diện của một dấu chấm động bằng chữ như một phần của phép cộng
chữ số
Chữ số nguyên có thể được viết là
Một số thập phân, không có tiền tố
Một số nhị phân, với tiền tố
nil
3Một số bát phân, với tiền tố
nil
4Một số thập lục phân, với tiền tố
nil
5
Tất cả các số nguyên này có giá trị thập phân là nil
6
- let decimalInteger = 17
- let binaryInteger = 0b10001 // 17 ở dạng nhị phân
- let octalInteger = 0o21 // 17 trong bát phân
- let hexadecimalInteger = 0x11 // 17 ở dạng thập lục phân
Các chữ số dấu phẩy động có thể là số thập phân [không có tiền tố] hoặc thập lục phân [có tiền tố nil
5]. Chúng phải luôn có một số [hoặc số thập lục phân] ở cả hai bên của dấu thập phân. Số thập phân float cũng có thể có một số mũ tùy chọn, được biểu thị bằng chữ hoa hoặc chữ thường nil
8;
Đối với số thập phân có số mũ là Double
00, cơ số được nhân với 10 lần
Double
01 có nghĩa là 1. 25 x 102 hoặcDouble
02Double
03 có nghĩa là 1. 25 x 10-2, hoặcDouble
04
Đối với các số thập lục phân có số mũ là Double
00, cơ số được nhân với 2exp
Double
06 có nghĩa là 15 x 22 hoặcDouble
07Double
08 có nghĩa là 15 x 2-2, hoặcDouble
09
Tất cả các chữ số dấu phẩy động này có giá trị thập phân là Double
10
- let decimalDouble = 12. 1875
- let exponentDouble = 1. 21875e1
- let hexadecimalDouble = 0xC. 3p0
Chữ số có thể chứa định dạng bổ sung để giúp chúng dễ đọc hơn. Cả số nguyên và số float đều có thể được đệm thêm số 0 và có thể chứa dấu gạch dưới để giúp dễ đọc. Cả hai loại định dạng đều không ảnh hưởng đến giá trị cơ bản của nghĩa đen
- let paddedDouble = 000123. 456
- hãy oneMillion = 1_000_000
- let justOverOneMillion = 1_000_000. 000_000_1
Chuyển đổi kiểu số
Sử dụng loại Int
cho tất cả các biến và hằng số nguyên có mục đích chung trong mã của bạn, ngay cả khi chúng được biết là không âm. Sử dụng kiểu số nguyên mặc định trong các tình huống hàng ngày có nghĩa là các hằng và biến số nguyên có thể tương tác ngay lập tức trong mã của bạn và sẽ khớp với kiểu được suy ra cho các giá trị số nguyên
Chỉ sử dụng các loại số nguyên khác khi chúng đặc biệt cần thiết cho tác vụ hiện tại, do dữ liệu có kích thước rõ ràng từ nguồn bên ngoài hoặc để thực hiện, sử dụng bộ nhớ hoặc tối ưu hóa cần thiết khác. Sử dụng các loại có kích thước rõ ràng trong những tình huống này giúp nắm bắt bất kỳ giá trị vô tình nào bị tràn và ghi lại bản chất của dữ liệu đang được sử dụng
Chuyển đổi số nguyên
Phạm vi của các số có thể được lưu trữ trong một hằng hoặc biến số nguyên là khác nhau đối với từng loại số. Hằng hoặc biến Double
12 có thể lưu các số trong khoảng từ Double
13 đến Double
14, trong khi hằng hoặc biến Array
0 có thể lưu các số trong khoảng từ Float
3 đến Double
17. Một số không vừa với hằng số hoặc biến của loại số nguyên có kích thước được báo cáo là lỗi khi mã của bạn được biên dịch
- let cannotBeNegative . UInt8 = -1
- // UInt8 không lưu được số âm nên sẽ báo lỗi
- hãy tooBig . Int8 = Int8 . tối đa + 1
- // Int8 không thể lưu số lớn hơn giá trị lớn nhất của nó,
- // và vì vậy điều này cũng sẽ báo lỗi
Vì mỗi loại số có thể lưu trữ một phạm vi giá trị khác nhau nên bạn phải chọn tham gia chuyển đổi loại số trong từng trường hợp cụ thể. Phương pháp chọn tham gia này ngăn ngừa các lỗi chuyển đổi ẩn và giúp làm rõ ý định chuyển đổi loại trong mã của bạn
Để chuyển đổi một loại số cụ thể sang loại số khác, bạn khởi tạo một số mới của loại mong muốn với giá trị hiện có. Trong ví dụ dưới đây, hằng số Double
18 thuộc loại Double
19, trong khi hằng số Double
20 thuộc loại Array
0. Chúng không thể được cộng trực tiếp với nhau vì chúng không cùng loại. Thay vào đó, ví dụ này gọi Double
22 để tạo một Double
19 mới được khởi tạo với giá trị là Double
20 và sử dụng giá trị này thay cho giá trị ban đầu
- hãy hai nghìn . UInt16 = 2_000
- hãy một . UInt8 = 1
- let twoThousandAndOne = twoThousand + UInt16[one]
Bởi vì cả hai bên của phần bổ sung hiện thuộc loại Double
19, phần bổ sung được cho phép. Hằng số đầu ra [Double
26] được suy ra là thuộc loại Double
19, bởi vì nó là tổng của hai giá trị Double
19
Double
29 là cách mặc định để gọi trình khởi tạo của loại Swift và chuyển vào giá trị ban đầu. Đằng sau hậu trường, Double
19 có một bộ khởi tạo chấp nhận giá trị Array
0 và vì vậy bộ khởi tạo này được sử dụng để tạo một Double
19 mới từ một Array
0 hiện có. Tuy nhiên, bạn không thể nhập bất kỳ loại nào ở đây—nó phải là loại mà Double
19 cung cấp trình khởi tạo. Mở rộng các loại hiện có để cung cấp trình khởi tạo chấp nhận các loại mới [bao gồm cả định nghĩa loại của riêng bạn] được đề cập trong Tiện ích mở rộng .
Chuyển đổi số nguyên và dấu phẩy động
Chuyển đổi giữa các loại số nguyên và số dấu phẩy động phải được thực hiện rõ ràng
- hãy ba = 3
- let pointOneFourOneFiveNine = 0. 14159
- let pi = Gấp đôi [ three] + pointOneFourOneFiveNine
- // pi bằng 3. 14159 và được suy ra là loại Double
Ở đây, giá trị của hằng số Double
35 được sử dụng để tạo một giá trị mới thuộc loại Double
, sao cho cả hai vế của phép cộng đều cùng loại. Nếu không có chuyển đổi này tại chỗ, việc bổ sung sẽ không được phép
Chuyển đổi dấu phẩy động thành số nguyên cũng phải được thực hiện rõ ràng. Một kiểu số nguyên có thể được khởi tạo với giá trị Double
hoặc Float
- let integerPi = Int [ pi]
- // integerPi bằng 3 và được suy ra là kiểu Int
Các giá trị dấu phẩy động luôn bị cắt bớt khi được sử dụng để khởi tạo một giá trị số nguyên mới theo cách này. Điều này có nghĩa là Double
39 trở thành Double
40 và Double
41 trở thành Double
42
Ghi chú
Quy tắc kết hợp hằng số và biến số khác với quy tắc kết hợp chữ số. Giá trị bằng chữ nil
1 có thể được thêm trực tiếp vào giá trị bằng chữ Double
44, bởi vì các chữ số không có kiểu rõ ràng trong và của chính chúng. Loại của chúng chỉ được suy ra khi chúng được trình biên dịch đánh giá
Nhập bí danh
Loại bí danh xác định tên thay thế cho loại hiện có. Bạn xác định bí danh loại với từ khóa Double
45
Bí danh loại hữu ích khi bạn muốn tham chiếu đến một loại hiện có bằng tên phù hợp hơn theo ngữ cảnh, chẳng hạn như khi làm việc với dữ liệu có kích thước cụ thể từ nguồn bên ngoài
- typealias AudioSample = UInt16
Khi bạn xác định bí danh loại, bạn có thể sử dụng bí danh ở bất kỳ đâu mà bạn có thể sử dụng tên gốc
- var maxAmplitudeFound = AudioSample . phút
- // maxAmplitudeFound bây giờ là 0
Ở đây, Double
46 được định nghĩa là bí danh cho Double
19. Bởi vì nó là một bí danh, lệnh gọi tới Double
48 thực sự gọi tới Double
49, cung cấp giá trị ban đầu là Float
3 cho biến Double
51
Booleans
Swift có một kiểu Boolean cơ bản, được gọi là Bool
. Các giá trị Boolean được gọi là logic, bởi vì chúng chỉ có thể đúng hoặc sai. Swift cung cấp hai giá trị hằng số Boolean, Double
53 và Double
54
- let orangesAreOrange = true
- let củ cải ngon = false
Các loại Double
55 và Double
56 đã được suy ra là Bool
từ thực tế là chúng được khởi tạo với các giá trị bằng chữ Boolean. Như với Int
và Double
ở trên, bạn không cần khai báo hằng hoặc biến là Bool
nếu bạn đặt chúng thành Double
53 hoặc Double
54 ngay khi bạn tạo chúng. Suy luận kiểu giúp làm cho mã Swift ngắn gọn và dễ đọc hơn khi nó khởi tạo các hằng hoặc biến với các giá trị khác có kiểu đã biết
Các giá trị Boolean đặc biệt hữu ích khi bạn làm việc với các câu lệnh có điều kiện, chẳng hạn như câu lệnh Double
63
- if củ cải ngon {
- in [ "Mmm, củ cải ngon. " ]
- } khác {
- print [ "Eww, củ cải thật kinh khủng. " ]
- }
- // Bản in "Eww, củ cải thật kinh khủng. "
Các câu lệnh có điều kiện như câu lệnh Double
63 được đề cập chi tiết hơn trong Luồng điều khiển .
Loại an toàn của Swift ngăn các giá trị không phải Boolean được thay thế cho Bool
. Ví dụ sau báo cáo lỗi thời gian biên dịch
- hãy i = 1
- nếu i {
- // ví dụ này sẽ không biên dịch và sẽ báo lỗi
- }
Tuy nhiên, ví dụ thay thế dưới đây là hợp lệ
- hãy i = 1
- if i == 1 {
- // ví dụ này sẽ biên dịch thành công
- }
Kết quả của phép so sánh Double
66 thuộc loại Bool
, vì vậy ví dụ thứ hai này vượt qua kiểm tra loại. Các phép so sánh như Double
66 được thảo luận trong Toán tử cơ bản .
Cũng như các ví dụ khác về an toàn kiểu trong Swift, cách tiếp cận này tránh được các lỗi ngẫu nhiên và đảm bảo rằng mục đích của một đoạn mã cụ thể luôn rõ ràng
bộ dữ liệu
Bộ dữ liệu nhóm nhiều giá trị thành một giá trị ghép duy nhất. Các giá trị trong một bộ có thể thuộc bất kỳ loại nào và không nhất thiết phải cùng loại với nhau
Trong ví dụ này, Double
69 là một bộ mô tả mã trạng thái HTTP. Mã trạng thái HTTP là một giá trị đặc biệt được máy chủ web trả về bất cứ khi nào bạn yêu cầu một trang web. Mã trạng thái của Double
70 được trả lại nếu bạn yêu cầu một trang web không tồn tại
- let Lỗi http404 = [ 404 , "Not Found"]
- // http404Error thuộc loại [Int, String] và bằng [404, "Not Found"]
Bộ dữ liệu Double
69 nhóm một Int
và một String
lại với nhau để cung cấp cho mã trạng thái HTTP hai giá trị riêng biệt. một con số và một mô tả mà con người có thể đọc được. Nó có thể được mô tả là “một bộ dữ liệu kiểu Double
74”
Bạn có thể tạo các bộ dữ liệu từ bất kỳ hoán vị nào của các loại và chúng có thể chứa bao nhiêu loại khác nhau tùy thích. Không có gì ngăn cản bạn có một bộ dữ liệu kiểu Double
75, hoặc Double
76, hoặc thực sự là bất kỳ hoán vị nào khác mà bạn yêu cầu
Bạn có thể phân tách nội dung của bộ dữ liệu thành các hằng số hoặc biến riêng biệt, sau đó bạn truy cập như bình thường
- hãy [ Mã trạng thái , Thông báo trạng thái] = http404Error
- in [ "Mã trạng thái là \ [statusCode]"]
- // In ra "Mã trạng thái là 404"
- in [ "Thông báo trạng thái là \ [statusMessage]"]
- // In ra "Thông báo trạng thái không tìm thấy"
Nếu bạn chỉ cần một số giá trị của bộ dữ liệu, hãy bỏ qua các phần của bộ dữ liệu có dấu gạch dưới [Double
77] khi bạn phân tách bộ dữ liệu
- let [ justTheStatusCode , _] = http404Error
- in [ "Mã trạng thái là \ [justTheStatusCode]"]
- // In ra "Mã trạng thái là 404"
Ngoài ra, truy cập các giá trị phần tử riêng lẻ trong một bộ bằng cách sử dụng các số chỉ mục bắt đầu từ 0
- in [ "Mã trạng thái là \ [ . http404Error.0]" ]
- // In ra "Mã trạng thái là 404"
- in [ "Thông báo trạng thái là \ [ . http404Error.1]" ]
- // In ra "Thông báo trạng thái không tìm thấy"
Bạn có thể đặt tên cho các phần tử riêng lẻ trong một bộ khi bộ được xác định
- let http200Status = [ statusCode . 200 , mô tả . "OK" ]
Nếu bạn đặt tên cho các phần tử trong một bộ, bạn có thể sử dụng tên phần tử để truy cập các giá trị của các phần tử đó
- in [ "Mã trạng thái là \ [ . http200Status.mã trạng thái]" ]
- // In ra "Mã trạng thái là 200"
- in [ "Thông báo trạng thái là \ [ . http200Status.mô tả]" ]
- // In ra "Thông báo trạng thái là OK"
Các bộ dữ liệu đặc biệt hữu ích như các giá trị trả về của các hàm. Một chức năng cố gắng truy xuất một trang web có thể trả về loại bộ dữ liệu Double
74 để mô tả thành công hay thất bại của việc truy xuất trang. Bằng cách trả về một bộ có hai giá trị riêng biệt, mỗi giá trị thuộc một loại khác nhau, hàm cung cấp nhiều thông tin hữu ích hơn về kết quả của nó so với việc nó chỉ có thể trả về một giá trị của một loại duy nhất. Để biết thêm thông tin, xem
Ghi chú
Bộ dữ liệu hữu ích cho các nhóm giá trị liên quan đơn giản. Chúng không phù hợp với việc tạo cấu trúc dữ liệu phức tạp. Nếu cấu trúc dữ liệu của bạn có thể phức tạp hơn, hãy mô hình hóa nó dưới dạng một lớp hoặc cấu trúc, thay vì dưới dạng một bộ. Để biết thêm thông tin, hãy xem Cấu trúc và lớp .
tùy chọn
Bạn sử dụng tùy chọn trong trường hợp có thể không có giá trị. Một tùy chọn đại diện cho hai khả năng. Có một giá trị và bạn có thể mở tùy chọn để truy cập giá trị đó hoặc không có giá trị nào cả
Ghi chú
Khái niệm về tùy chọn không tồn tại trong C hoặc Objective-C. Điều gần nhất trong Mục tiêu-C là khả năng trả về nil
từ một phương thức mà nếu không sẽ trả về một đối tượng, với nil
có nghĩa là “sự vắng mặt của một đối tượng hợp lệ. ” Tuy nhiên, điều này chỉ hoạt động đối với các đối tượng—nó không hoạt động đối với cấu trúc, kiểu C cơ bản hoặc giá trị liệt kê. Đối với các loại này, các phương thức Objective-C thường trả về một giá trị đặc biệt [chẳng hạn như Double
81] để biểu thị sự vắng mặt của một giá trị. Cách tiếp cận này giả định rằng người gọi phương thức biết có một giá trị đặc biệt để kiểm tra và nhớ kiểm tra nó. Các tùy chọn của Swift cho phép bạn chỉ ra sự vắng mặt của một giá trị cho bất kỳ loại nào mà không cần các hằng số đặc biệt
Đây là một ví dụ về cách tùy chọn có thể được sử dụng để đối phó với việc không có giá trị. Loại Int
của Swift có một trình khởi tạo cố gắng chuyển đổi giá trị String
thành giá trị Int
. Tuy nhiên, không phải chuỗi nào cũng có thể chuyển thành số nguyên. Chuỗi Double
85 có thể được chuyển đổi thành giá trị số Double
86, nhưng chuỗi Double
87 không có giá trị số rõ ràng để chuyển đổi thành
Ví dụ bên dưới sử dụng trình khởi tạo để cố gắng chuyển đổi một String
thành một Int
- hãy Số có thể = "123"
- let convertedNumber = Int [ possibleNumber]
- // convertNumber được suy ra là kiểu "Int?", hoặc "Int tùy chọn"
Bởi vì trình khởi tạo có thể bị lỗi, nên nó trả về một Int
tùy chọn, thay vì một Int
. Một tùy chọn Int
được viết là Double
93, không phải là Int
. Dấu chấm hỏi cho biết giá trị mà nó chứa là tùy chọn, nghĩa là nó có thể chứa một số giá trị Int
hoặc có thể không chứa giá trị nào cả. [Nó không thể chứa bất kỳ thứ gì khác, chẳng hạn như giá trị Bool
hoặc giá trị String
. Đó là một Int
, hoặc chẳng là gì cả. ]
không
Bạn đặt biến tùy chọn thành trạng thái vô giá trị bằng cách gán cho nó giá trị đặc biệt nil
- var serverResponseCode . Int ? 404
- // serverResponseCode chứa giá trị Int thực là 404
- serverResponseCode = không
- // serverResponseCode bây giờ không chứa giá trị
Ghi chú
Bạn không thể sử dụng nil
với các hằng số và biến không bắt buộc. Nếu một hằng số hoặc biến trong mã của bạn cần hoạt động mà không có giá trị trong một số điều kiện nhất định, hãy luôn khai báo nó dưới dạng giá trị tùy chọn thuộc loại thích hợp
Nếu bạn xác định một biến tùy chọn mà không cung cấp giá trị mặc định, thì biến đó sẽ tự động được đặt thành nil
cho bạn
- var câu trả lời khảo sát . Chuỗi ?
- // SurveyAnswer được tự động đặt thành không
Ghi chú
nil
của Swift không giống với nil
trong Objective-C. Trong Objective-C, nil
là một con trỏ tới một đối tượng không tồn tại. Trong Swift, nil
không phải là một con trỏ—đó là sự vắng mặt của một giá trị thuộc một loại nhất định. Tùy chọn của bất kỳ loại nào có thể được đặt thành nil
, không chỉ các loại đối tượng
Câu lệnh If và Unwrapping bắt buộc
Bạn có thể sử dụng câu lệnh Double
63 để tìm hiểu xem một tùy chọn có chứa giá trị hay không bằng cách so sánh tùy chọn với nil
. Bạn thực hiện phép so sánh này với toán tử “bằng” [Float
09] hoặc toán tử “không bằng” [Float
10]
Nếu một tùy chọn có giá trị, nó được coi là “không bằng” nil
- if convertedNumber . = không {
- print [ "convertedNumber chứa một số giá trị số nguyên. " ]
- }
- // In "convertedNumber chứa một số giá trị số nguyên. "
Khi bạn chắc chắn rằng tùy chọn có chứa giá trị, bạn có thể truy cập giá trị cơ bản của nó bằng cách thêm dấu chấm than [Float
12] vào cuối tên của tùy chọn. Dấu chấm than nói một cách hiệu quả, “Tôi biết rằng tùy chọn này chắc chắn có giá trị; . ” Điều này được gọi là bắt buộc mở giá trị của tùy chọn
- if convertedNumber . = không {
- print [ "convertedNumber có giá trị nguyên là \ [convertedNumber!]. " ]
- }
- // In ra "convertedNumber có giá trị nguyên là 123. "
Để biết thêm về câu lệnh Double
63, hãy xem Luồng điều khiển .
Ghi chú
Cố gắng sử dụng Float
12 để truy cập một giá trị tùy chọn không tồn tại sẽ gây ra lỗi thời gian chạy. Luôn đảm bảo rằng một tùy chọn chứa giá trị không phải ____8_______ trước khi sử dụng ____2_______12 để buộc mở gói giá trị của nó
Ràng buộc tùy chọn
Bạn sử dụng liên kết tùy chọn để tìm hiểu xem tùy chọn có chứa giá trị hay không và nếu có, để cung cấp giá trị đó dưới dạng hằng số hoặc biến tạm thời. Liên kết tùy chọn có thể được sử dụng với các câu lệnh Double
63 và Float
18 để kiểm tra một giá trị bên trong một tùy chọn và để trích xuất giá trị đó thành một hằng số hoặc biến, như một phần của một hành động. Câu lệnh Double
63 và Float
18 được mô tả chi tiết hơn trong Luồng điều khiển .
Viết một liên kết tùy chọn cho một câu lệnh Double
63 như sau
- if let constantName = someOptional {
- các câu lệnh
- }
Bạn có thể viết lại ví dụ Float
22 từ phần này để sử dụng liên kết tùy chọn thay vì buộc mở
- if let actualNumber = Int[possibleNumber] {
- in [ "Chuỗi \" \ [possibleNumber]\" has an integer value of \[actualNumber]"]
- } khác {
- in [ "Chuỗi \" \ [possibleNumber]\" couldn't be converted to an integer"]
- }
- // In ra "Chuỗi "123" có giá trị nguyên là 123"
Mã này có thể được đọc là
“Nếu Int
tùy chọn được trả về bởi Float
24 chứa một giá trị, hãy đặt một hằng số mới có tên là Float
25 thành giá trị có trong tùy chọn. ”
Nếu chuyển đổi thành công, hằng số Float
25 sẽ có sẵn để sử dụng trong nhánh đầu tiên của câu lệnh Double
63. Nó đã được khởi tạo với giá trị chứa trong tùy chọn, vì vậy bạn không sử dụng hậu tố Float
12 để truy cập giá trị của nó. Trong ví dụ này, Float
25 chỉ đơn giản được sử dụng để in kết quả chuyển đổi
Nếu bạn không cần tham chiếu đến hằng số hoặc biến tùy chọn ban đầu sau khi truy cập giá trị mà nó chứa, bạn có thể sử dụng cùng một tên cho hằng số hoặc biến mới
- let myNumber = Int [ possibleNumber]
- // Ở đây, myNumber là một số nguyên tùy chọn
- if let myNumber = myNumber {
- // Ở đây, myNumber là một số nguyên không bắt buộc
- in [ "Số của tôi là \ [= 0, "A person's age can't be less than zero." ]
- // Khẳng định này không thành công vì -3 không >= 0
Trong ví dụ này, việc thực thi mã tiếp tục nếu Float
88 ước tính thành Double
53, nghĩa là, nếu giá trị của Float
90 là không âm. Nếu giá trị của Float
90 là âm, như trong mã ở trên, thì Float
88 ước tính thành Double
54 và xác nhận không thành công, chấm dứt ứng dụng
Bạn có thể bỏ qua thông báo xác nhận—ví dụ: khi nó chỉ lặp lại điều kiện dưới dạng văn xuôi
- khẳng định [ tuổi >= 0]
Nếu mã đã kiểm tra điều kiện, bạn sử dụng hàm Float
94 để chỉ ra rằng một xác nhận không thành công. Ví dụ
- nếu tuổi > 10 {
- print [ "Bạn có thể đi tàu lượn siêu tốc hoặc đu quay. " ]
- } khác nếu tuổi >= 0 {
- print [ "Bạn có thể đi đu quay. " ]
- } khác {
- assertionFailure [ "Tuổi của một người không được nhỏ hơn 0. " ]
- }
Thực thi các điều kiện tiên quyết
Sử dụng điều kiện tiên quyết bất cứ khi nào điều kiện có khả năng sai, nhưng chắc chắn phải đúng để mã của bạn tiếp tục thực thi. Ví dụ: sử dụng điều kiện tiên quyết để kiểm tra xem chỉ số dưới có nằm ngoài giới hạn hay không hoặc để kiểm tra xem một hàm đã được chuyển một giá trị hợp lệ chưa
Bạn viết một điều kiện tiên quyết bằng cách gọi hàm Float
95. Bạn truyền vào hàm này một biểu thức đánh giá thành Double
53 hoặc Double
54 và một thông báo sẽ hiển thị nếu kết quả của điều kiện là Double
54. Ví dụ
- // Trong quá trình triển khai một chỉ số
- điều kiện tiên quyết [ chỉ số > 0, "Index must be greater than zero." ]
Bạn cũng có thể gọi hàm Float
99 để cho biết rằng đã xảy ra lỗi—ví dụ: nếu trường hợp mặc định của một công tắc đã được thực hiện, nhưng tất cả dữ liệu đầu vào hợp lệ phải được xử lý bởi một trong các trường hợp khác của công tắc
Ghi chú
Nếu bạn biên dịch ở chế độ không được kiểm tra [_______3_______00], điều kiện tiên quyết không được kiểm tra. Trình biên dịch giả định rằng các điều kiện tiên quyết luôn đúng và nó sẽ tối ưu hóa mã của bạn cho phù hợp. Tuy nhiên, hàm Bool
01 luôn tạm dừng thực thi, bất kể cài đặt tối ưu hóa
Bạn có thể sử dụng hàm Bool
01 trong quá trình tạo mẫu và phát triển ban đầu để tạo sơ khai cho chức năng chưa được triển khai, bằng cách viết Bool
03 dưới dạng triển khai sơ khai. Bởi vì các lỗi nghiêm trọng không bao giờ được tối ưu hóa, không giống như các xác nhận hoặc điều kiện tiên quyết, bạn có thể chắc chắn rằng quá trình thực thi luôn bị dừng nếu nó gặp phải một triển khai sơ khai