Html 2 chữ số thập phân

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, DoubleFloat 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, SetDictionary, 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ư Double4 hoặc Double5) với một giá trị của một loại cụ thể (chẳng hạn như số Double6 hoặc chuỗi Double7). 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 Double8 và biến với từ khóa Double9. 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

  1. let số lần đăng nhập tối đa = 10
  2. 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à Double4 và đặt cho nó một giá trị là Double6. Sau đó, khai báo một biến mới có tên là Float2 và đặt cho nó giá trị ban đầu là Float3. ”

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

  1. 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 Double8. 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à Double5, để chỉ ra rằng biến đó có thể lưu trữ các giá trị String

  1. 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à Double5 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 Double5 hiện có thể được đặt thành bất kỳ giá trị chuỗi nào mà không gặp lỗi

  1. 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

  1. 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ề Double5 ở trên, không có giá trị ban đầu nào được cung cấp và do đó, loại biến Double5 đượ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

  1. hãy π = 3. 14159
  2. let 你好 = "你好世界"
  3. 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 (Bool4) 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 Bool5 được thay đổi từ Bool6 thành Bool7

  1. var thân thiệnChào mừng = "Xin chào. "
  2. thân thiệnChào mừng = "Bonjour. "
  3. // 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

  1. let languageName = "Swift"
  2. languageName = "Swift++"
  3. // Đâ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 Bool8

  1. in ( chào mừng thân thiện )
  2. // Bản in "Bonjour. "

Hàm Bool8 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 Bool8 in đầu ra của nó trong ngăn “bảng điều khiển” của Xcode. Tham số String1 và String2 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ụ: String3. Để 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ở

  1. print ( "Giá trị hiện tại của friendlyWelcome là \ (friendlyWelcome)")
  2. // 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 (String4)

  1. // Đâ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ị (String5) và kết thúc bằng dấu hoa thị, sau đó là dấu gạch chéo lên trước (String6)

  1. /* Đây cũng là một chú thích
  2. 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

  1. /* Đây là điểm bắt đầu của chú thích nhiều dòng đầu tiên
  2. /* Đây là chú thích nhiều dòng lồng nhau thứ hai. */
  3. Đâ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 (String7) 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

  1. hãy mèo = "🐱" ; print(cat)
  2. // 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ư String8 và String9. 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 Array0 và số nguyên có dấu 32 bit thuộc loại Array1. 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 Array2 và Array3 của nó

  1. let minValue = UInt8 . min // minValue bằng 0 và thuộc loại UInt8
  2. 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ư Array0 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ới Array1

  • Trên nền tảng 64-bit, Int có cùng kích thước với Array9

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ừ Set2 đến Set3 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, Set4, 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, Set4 có cùng kích thước với Set6

  • Trên nền tảng 64-bit, Set4 có cùng kích thước với Set8

Ghi chú

Chỉ sử dụng Set4 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ư Dictionary2, Dictionary3 và Dictionary4

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 bit

  • Float đạ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ư String8 và Dictionary2 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à String8 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

  1. let meaningOfLife = 42
  2. // 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

  1. let pi = 3. 14159
  2. // 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

  1. let anotherPi = 3 + 0.14159
  2. // AnotherPi cũng được suy ra là kiểu Double

Giá trị bằng chữ của nil1 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ố nil3

  • Một số bát phân, với tiền tố nil4

  • Một số thập lục phân, với tiền tố nil5

Tất cả các số nguyên này có giá trị thập phân là nil6

  1. let decimalInteger = 17
  2. let binaryInteger = 0b10001 // 17 ở dạng nhị phân
  3. let octalInteger = 0o21 // 17 trong bát phân
  4. 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ố nil5). 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 nil8;

Đối với số thập phân có số mũ là Double00, cơ số được nhân với 10 lần

  • Double01 có nghĩa là 1. 25 x 102 hoặc Double02

  • Double03 có nghĩa là 1. 25 x 10-2, hoặc Double04

Đối với các số thập lục phân có số mũ là Double00, cơ số được nhân với 2exp

  • Double06 có nghĩa là 15 x 22 hoặc Double07

  • Double08 có nghĩa là 15 x 2-2, hoặc Double09

Tất cả các chữ số dấu phẩy động này có giá trị thập phân là Double10

  1. let decimalDouble = 12. 1875
  2. let exponentDouble = 1. 21875e1
  3. 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

  1. let paddedDouble = 000123. 456
  2. hãy oneMillion = 1_000_000
  3. 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 Double12 có thể lưu các số trong khoảng từ Double13 đến Double14, trong khi hằng hoặc biến Array0 có thể lưu các số trong khoảng từ Float3 đến Double17. 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

  1. let cannotBeNegative . UInt8 = -1
  2. // UInt8 không lưu được số âm nên sẽ báo lỗi
  3. hãy tooBig . Int8 = Int8 . tối đa + 1
  4. // Int8 không thể lưu số lớn hơn giá trị lớn nhất của nó,
  5. // 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ố Double18 thuộc loại Double19, trong khi hằng số Double20 thuộc loại Array0. 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 Double22 để tạo một Double19 mới được khởi tạo với giá trị là Double20 và sử dụng giá trị này thay cho giá trị ban đầu

  1. hãy hai nghìn . UInt16 = 2_000
  2. hãy một . UInt8 = 1
  3. let twoThousandAndOne = twoThousand + UInt16(one)

Bởi vì cả hai bên của phần bổ sung hiện thuộc loại Double19, phần bổ sung được cho phép. Hằng số đầu ra (Double26) được suy ra là thuộc loại Double19, bởi vì nó là tổng của hai giá trị Double19

Double29 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, Double19 có một bộ khởi tạo chấp nhận giá trị Array0 và vì vậy bộ khởi tạo này được sử dụng để tạo một Double19 mới từ một Array0 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à Double19 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

  1. hãy ba = 3
  2. let pointOneFourOneFiveNine = 0. 14159
  3. let pi = Gấp đôi ( three) + pointOneFourOneFiveNine
  4. // pi bằng 3. 14159 và được suy ra là loại Double

Ở đây, giá trị của hằng số Double35 đượ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

  1. let integerPi = Int ( pi)
  2. // 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à Double39 trở thành Double40 và Double41 trở thành Double42

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ữ nil1 có thể được thêm trực tiếp vào giá trị bằng chữ Double44, 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 Double45

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

  1. 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

  1. var maxAmplitudeFound = AudioSample . phút
  2. // maxAmplitudeFound bây giờ là 0

Ở đây, Double46 được định nghĩa là bí danh cho Double19. Bởi vì nó là một bí danh, lệnh gọi tới Double48 thực sự gọi tới Double49, cung cấp giá trị ban đầu là Float3 cho biến Double51

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, Double53 và Double54

  1. let orangesAreOrange = true
  2. let củ cải ngon = false

Các loại Double55 và Double56 đã đượ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 IntDouble ở 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 Double53 hoặc Double54 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 Double63

  1. if củ cải ngon {
  2. in ( "Mmm, củ cải ngon. " )
  3. } khác {
  4. print ( "Eww, củ cải thật kinh khủng. " )
  5. }
  6. // 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 Double63 đượ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

  1. hãy i = 1
  2. nếu i {
  3. // ví dụ này sẽ không biên dịch và sẽ báo lỗi
  4. }

Tuy nhiên, ví dụ thay thế dưới đây là hợp lệ

  1. hãy i = 1
  2. if i == 1 {
  3. // ví dụ này sẽ biên dịch thành công
  4. }

Kết quả của phép so sánh Double66 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ư Double66 đượ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, Double69 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 Double70 được trả lại nếu bạn yêu cầu một trang web không tồn tại

  1. let Lỗi http404 = ( 404 , "Not Found")
  2. // http404Error thuộc loại (Int, String) và bằng (404, "Not Found")

Bộ dữ liệu Double69 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 Double74”

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 Double75, hoặc Double76, 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

  1. hãy ( Mã trạng thái , Thông báo trạng thái) = http404Error
  2. in ( "Mã trạng thái là \ (statusCode)")
  3. // In ra "Mã trạng thái là 404"
  4. in ( "Thông báo trạng thái là \ (statusMessage)")
  5. // 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 (Double77) khi bạn phân tách bộ dữ liệu

  1. let ( justTheStatusCode , _) = http404Error
  2. in ( "Mã trạng thái là \ (justTheStatusCode)")
  3. // 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

  1. in ( "Mã trạng thái là \ ( . http404Error.0)" )
  2. // In ra "Mã trạng thái là 404"
  3. in ( "Thông báo trạng thái là \ ( . http404Error.1)" )
  4. // 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

  1. 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ử đó

  1. in ( "Mã trạng thái là \ ( . http200Status.mã trạng thái)" )
  2. // In ra "Mã trạng thái là 200"
  3. in ( "Thông báo trạng thái là \ ( . http200Status.mô tả)" )
  4. // 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 Double74 để 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ư Double81) để 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 Double85 có thể được chuyển đổi thành giá trị số Double86, nhưng chuỗi Double87 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

  1. hãy Số có thể = "123"
  2. let convertedNumber = Int ( possibleNumber)
  3. // 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à Double93, 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

  1. var serverResponseCode . Int ? 404
  2. // serverResponseCode chứa giá trị Int thực là 404
  3. serverResponseCode = không
  4. // 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

  1. var câu trả lời khảo sát . Chuỗi ?
  2. // 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 Double63 để 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” (Float09) hoặc toán tử “không bằng” (Float10)

Nếu một tùy chọn có giá trị, nó được coi là “không bằng” nil

  1. if convertedNumber . = không {
  2. print ( "convertedNumber chứa một số giá trị số nguyên. " )
  3. }
  4. // 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 (Float12) 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

  1. if convertedNumber . = không {
  2. print ( "convertedNumber có giá trị nguyên là \ (convertedNumber!). " )
  3. }
  4. // In ra "convertedNumber có giá trị nguyên là 123. "

Để biết thêm về câu lệnh Double63, hãy xem Luồng điều khiển .

Ghi chú

Cố gắng sử dụng Float12 để 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 Double63 và Float18 để 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 Double63 và Float18 đượ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 Double63 như sau

  1. if let constantName = someOptional {
  2. các câu lệnh
  3. }

Bạn có thể viết lại ví dụ Float22 từ phần này để sử dụng liên kết tùy chọn thay vì buộc mở

  1. if let actualNumber = Int(possibleNumber) {
  2. in ( "Chuỗi \" \ (possibleNumber)\" has an integer value of \(actualNumber)")
  3. } khác {
  4. in ( "Chuỗi \" \ (possibleNumber)\" couldn't be converted to an integer")
  5. }
  6. // 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 Float24 chứa một giá trị, hãy đặt một hằng số mới có tên là Float25 thành giá trị có trong tùy chọn. ”

Nếu chuyển đổi thành công, hằng số Float25 sẽ có sẵn để sử dụng trong nhánh đầu tiên của câu lệnh Double63. 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ố Float12 để truy cập giá trị của nó. Trong ví dụ này, Float25 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

  1. let myNumber = Int ( possibleNumber)
  2. // Ở đây, myNumber là một số nguyên tùy chọn
  3. if let myNumber = myNumber {
  4. // Ở đây, myNumber là một số nguyên không bắt buộc
  5. in ( "Số của tôi là \ (<myNumber)")
  6. }
  7. // In ra "Số của tôi là 123"

Mã này bắt đầu bằng cách kiểm tra xem Float30 có chứa giá trị hay không, giống như mã trong ví dụ trước. Nếu Float30 có một giá trị, thì giá trị của một hằng số mới có tên là Float30 được đặt thành giá trị đó. Bên trong phần thân của câu lệnh Double63, viết Float30 đề cập đến hằng số không bắt buộc mới đó. Trước khi bắt đầu câu lệnh Double63 và sau khi kết thúc, viết Float30 đề cập đến hằng số nguyên tùy chọn

Vì loại mã này rất phổ biến nên bạn có thể sử dụng cách viết ngắn hơn để mở khóa một giá trị tùy chọn. chỉ viết tên của hằng số hoặc biến mà bạn đang mở gói. Hằng số hoặc biến mới, chưa được bao bọc hoàn toàn sử dụng cùng tên với giá trị tùy chọn

  1. if let myNumber {
  2. in ( "Số của tôi là \ (<myNumber)")
  3. }
  4. // In ra "Số của tôi là 123"

Bạn có thể sử dụng cả hằng và biến với liên kết tùy chọn. Nếu bạn muốn thao tác giá trị của Float30 trong nhánh đầu tiên của câu lệnh Double63, thay vào đó, bạn có thể viết Float39 và giá trị chứa trong tùy chọn sẽ được cung cấp dưới dạng biến thay vì hằng số. Những thay đổi bạn thực hiện đối với Float30 bên trong phần nội dung của câu lệnh Double63 chỉ áp dụng cho biến cục bộ đó, không áp dụng cho hằng số hoặc biến tùy chọn ban đầu mà bạn đã mở gói

Bạn có thể bao gồm bao nhiêu ràng buộc tùy chọn và điều kiện Boolean trong một câu lệnh Double63 nếu bạn cần, được phân tách bằng dấu phẩy. Nếu bất kỳ giá trị nào trong các ràng buộc tùy chọn là _______8_______ hoặc bất kỳ điều kiện Boolean nào ước tính thành __1_______54, thì toàn bộ điều kiện của câu lệnh _________63 được coi là _______1_______54. Các câu lệnh Double63 sau đây là tương đương

  1. if let firstNumber = Int("4"), let secondNumber = Int("42"), firstNumber < secondNumber && secondNumber < 100 {
  2. in ( " \ (firstNumber) < \(secondNumber) < 100")
  3. }
  4. // In ra "4 < 42 < 100"
  5. if let firstNumber = Int("4") {
  6. if let secondNumber = Int("42") {
  7. if Số thứ nhất < Số thứ hai && secondNumber < 100 {
  8. in ( " \ (firstNumber) < \(secondNumber) < 100")
  9. }
  10. }
  11. }
  12. // In ra "4 < 42 < 100"

Ghi chú

Các hằng số và biến được tạo bằng liên kết tùy chọn trong câu lệnh Double63 chỉ có sẵn trong phần nội dung của câu lệnh Double63. Ngược lại, các hằng và biến được tạo bằng câu lệnh Float50 có sẵn trong các dòng mã tuân theo câu lệnh Float50, như được mô tả trong

Các tùy chọn được mở hoàn toàn

Như đã mô tả ở trên, tùy chọn chỉ ra rằng một hằng hoặc biến được phép có “không có giá trị”. Các tùy chọn có thể được kiểm tra bằng câu lệnh Double63 để xem giá trị có tồn tại hay không và có thể được mở theo điều kiện bằng liên kết tùy chọn để truy cập giá trị của tùy chọn nếu nó tồn tại

Đôi khi, rõ ràng từ cấu trúc của chương trình rằng một tùy chọn sẽ luôn có một giá trị, sau khi giá trị đó được đặt lần đầu tiên. Trong những trường hợp này, sẽ rất hữu ích nếu bạn loại bỏ nhu cầu kiểm tra và mở gói giá trị của tùy chọn mỗi khi nó được truy cập, bởi vì nó có thể được coi là luôn có giá trị một cách an toàn

Các loại tùy chọn này được định nghĩa là các tùy chọn không được bao bọc hoàn toàn. Bạn viết một tùy chọn không được bao bọc hoàn toàn bằng cách đặt dấu chấm than (Float53) thay vì dấu chấm hỏi (Float54) sau loại mà bạn muốn đặt thành tùy chọn. Thay vì đặt dấu chấm than sau tên của tùy chọn khi bạn sử dụng nó, bạn đặt dấu chấm than sau loại tùy chọn khi bạn khai báo nó

Các tùy chọn được mở hoàn toàn hữu ích khi giá trị của một tùy chọn được xác nhận là tồn tại ngay sau khi tùy chọn được xác định lần đầu và chắc chắn có thể được coi là tồn tại ở mọi thời điểm sau đó. Việc sử dụng chính các tùy chọn được mở hoàn toàn trong Swift là trong quá trình khởi tạo lớp, như được mô tả trong

Tùy chọn chưa mở gói hoàn toàn là một tùy chọn bình thường ẩn sau hậu trường, nhưng cũng có thể được sử dụng như một giá trị không phải tùy chọn mà không cần mở gói giá trị tùy chọn mỗi khi nó được truy cập. Ví dụ sau đây cho thấy sự khác biệt trong hành vi giữa một chuỗi tùy chọn và một chuỗi tùy chọn không được bao bọc hoàn toàn khi truy cập giá trị được bao bọc của chúng dưới dạng một String rõ ràng

  1. let possibleString . Chuỗi ? . " "An optional string."
  2. let forcedString . Chuỗi = possibleString . // yêu cầu dấu chấm than
  3. let chuỗi giả định . Chuỗi . = "Một chuỗi tùy chọn chưa được mở hoàn toàn. "
  4. let implicitString . Chuỗi = asssumedString // không cần dấu chấm than

Bạn có thể nghĩ về một tùy chọn được mở hoàn toàn khi cho phép tùy chọn được mở ra nếu cần. Khi bạn sử dụng một giá trị tùy chọn không bao bọc hoàn toàn, trước tiên Swift sẽ cố gắng sử dụng nó như một giá trị tùy chọn thông thường; . Trong đoạn mã trên, giá trị tùy chọn Float56 bị buộc mở gói trước khi gán giá trị của nó cho Float57 vì Float57 có loại String rõ ràng, không tùy chọn. Trong mã bên dưới, Float60 không có loại rõ ràng nên đây là tùy chọn thông thường

  1. let OptionalString = AssumedString
  2. // Loại tùy chọnString là "Chuỗi?"

Nếu một tùy chọn chưa được bao bọc hoàn toàn là nil và bạn cố gắng truy cập giá trị được bao bọc của nó, thì bạn sẽ gây ra lỗi thời gian chạy. Kết quả hoàn toàn giống như khi bạn đặt dấu chấm than sau một tùy chọn thông thường không chứa giá trị

Bạn có thể kiểm tra xem một tùy chọn không bao bọc hoàn toàn có phải là nil hay không giống như cách bạn kiểm tra một tùy chọn bình thường

  1. if AssumedString . = không {
  2. in ( chuỗi giả định . )
  3. }
  4. // In ra "Chuỗi tùy chọn chưa được mở hoàn toàn. "

Bạn cũng có thể sử dụng một tùy chọn được mở hoàn toàn với ràng buộc tùy chọn, để kiểm tra và mở giá trị của nó trong một câu lệnh

  1. if let definiteString = asssumedString {
  2. in ( definiteString )
  3. }
  4. // In ra "Chuỗi tùy chọn chưa được mở hoàn toàn. "

Ghi chú

Không sử dụng một tùy chọn không được bao bọc hoàn toàn khi có khả năng một biến trở thành nil sau đó. Luôn sử dụng loại tùy chọn thông thường nếu bạn cần kiểm tra giá trị nil trong suốt thời gian tồn tại của biến

Xử lý lỗi

Bạn sử dụng xử lý lỗi để phản hồi các điều kiện lỗi mà chương trình của bạn có thể gặp phải trong quá trình thực thi

Ngược lại với các tùy chọn, có thể sử dụng sự hiện diện hoặc vắng mặt của một giá trị để thông báo thành công hay thất bại của một chức năng, việc xử lý lỗi cho phép bạn xác định nguyên nhân cơ bản của lỗi và, nếu cần, truyền lỗi đến một phần khác của chương trình của bạn

Khi một hàm gặp điều kiện lỗi, nó sẽ báo lỗi. Sau đó, người gọi chức năng đó có thể bắt lỗi và phản hồi một cách thích hợp

  1. func canThrowAnError () ném {
  2. // hàm này có thể báo lỗi hoặc không
  3. }

Một hàm chỉ ra rằng nó có thể đưa ra lỗi bằng cách đưa từ khóa Float65 vào phần khai báo của nó. Khi bạn gọi một hàm có thể đưa ra lỗi, bạn thêm từ khóa Float66 vào trước biểu thức

Swift tự động lan truyền lỗi ra khỏi phạm vi hiện tại của chúng cho đến khi chúng được xử lý bởi mệnh đề Float67

  1. làm {
  2. thử canThrowAnError ()
  3. // không có lỗi nào được ném ra
  4. } bắt {
  5. // một lỗi đã được đưa ra
  6. }

Một câu lệnh Float68 tạo ra một phạm vi chứa mới, cho phép các lỗi được lan truyền đến một hoặc nhiều mệnh đề Float67

Dưới đây là một ví dụ về cách xử lý lỗi có thể được sử dụng để đáp ứng các điều kiện lỗi khác nhau

  1. func makeASandwich () ném {
  2. //
  3. }
  4. làm {
  5. thử makeASandwich ()
  6. eatASandwich ()
  7. } bắt SandwichError . outOfCleanDishes {
  8. rửa bát đĩa ()
  9. } bắt SandwichError . thiếuIngredients ( let ingredients )
  10. mua hàng tạp hóa ( nguyên liệu )
  11. }

Trong ví dụ này, hàm Float70 sẽ đưa ra lỗi nếu không có đĩa sạch hoặc nếu thiếu bất kỳ nguyên liệu nào. Bởi vì Float70 có thể gây ra lỗi, lệnh gọi hàm được bao bọc trong biểu thức Float66. Bằng cách gói lời gọi hàm trong một câu lệnh Float68, bất kỳ lỗi nào được đưa ra sẽ được truyền đến các mệnh đề Float67 đã cung cấp

Nếu không có lỗi xảy ra, hàm Float75 được gọi. Nếu một lỗi được đưa ra và nó khớp với trường hợp Float76, thì hàm Float77 sẽ được gọi. Nếu một lỗi được đưa ra và nó khớp với trường hợp Float78, thì hàm Float79 được gọi với giá trị Float80 được liên kết được bắt bởi mẫu Float67

Việc ném, bắt và lan truyền lỗi được trình bày chi tiết hơn trong Xử lý lỗi .

Khẳng định và điều kiện tiên quyết

Các xác nhận và điều kiện tiên quyết là các kiểm tra xảy ra trong thời gian chạy. Bạn sử dụng chúng để đảm bảo một điều kiện thiết yếu được thỏa mãn trước khi thực hiện bất kỳ mã nào khác. Nếu điều kiện Boolean trong xác nhận hoặc điều kiện tiên quyết ước tính là Double53, việc thực thi mã sẽ tiếp tục như bình thường. Nếu điều kiện đánh giá là Double54, thì trạng thái hiện tại của chương trình không hợp lệ;

Bạn sử dụng các xác nhận và điều kiện tiên quyết để diễn đạt các giả định mà bạn đưa ra và các kỳ vọng mà bạn có trong khi viết mã, vì vậy bạn có thể đưa chúng vào như một phần của mã của mình. Các xác nhận giúp bạn tìm ra các lỗi và giả định không chính xác trong quá trình phát triển và các điều kiện tiên quyết giúp bạn phát hiện các vấn đề trong quá trình sản xuất

Ngoài việc xác minh kỳ vọng của bạn trong thời gian chạy, các xác nhận và điều kiện tiên quyết cũng trở thành một dạng tài liệu hữu ích trong mã. Không giống như các điều kiện lỗi được thảo luận ở trên, các xác nhận và điều kiện tiên quyết không được sử dụng cho các lỗi có thể khôi phục hoặc dự kiến. Vì một xác nhận hoặc điều kiện tiên quyết không thành công cho biết trạng thái chương trình không hợp lệ, nên không có cách nào để bắt một xác nhận không thành công

Việc sử dụng các xác nhận và điều kiện tiên quyết không phải là sự thay thế cho việc thiết kế mã của bạn theo cách mà các điều kiện không hợp lệ khó có thể phát sinh. Tuy nhiên, việc sử dụng chúng để thực thi trạng thái và dữ liệu hợp lệ sẽ khiến ứng dụng của bạn chấm dứt dễ đoán hơn nếu xảy ra trạng thái không hợp lệ và giúp gỡ lỗi vấn đề dễ dàng hơn. Dừng thực thi ngay khi phát hiện trạng thái không hợp lệ cũng giúp hạn chế thiệt hại do trạng thái không hợp lệ đó gây ra

Sự khác biệt giữa các xác nhận và điều kiện tiên quyết là khi chúng được kiểm tra. Các xác nhận chỉ được kiểm tra trong các bản dựng gỡ lỗi, nhưng các điều kiện tiên quyết được kiểm tra trong cả bản dựng gỡ lỗi và sản xuất. Trong các bản dựng sản xuất, điều kiện bên trong một xác nhận không được đánh giá. Điều này có nghĩa là bạn có thể sử dụng bao nhiêu xác nhận tùy thích trong quá trình phát triển của mình mà không ảnh hưởng đến hiệu suất trong sản xuất

Gỡ lỗi với các xác nhận

Bạn viết một khẳng định bằng cách gọi hàm Float84 từ thư viện chuẩn Swift. Bạn chuyển vào hàm này một biểu thức đánh giá thành Double53 hoặc Double54 và một thông báo sẽ hiển thị nếu kết quả của điều kiện là Double54. Ví dụ

  1. hãy tuổi = -3
  2. khẳng định ( tuổi >= 0, "A person's age can't be less than zero." )
  3. // 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 Float88 ước tính thành Double53, nghĩa là, nếu giá trị của Float90 là không âm. Nếu giá trị của Float90 là âm, như trong mã ở trên, thì Float88 ước tính thành Double54 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

  1. khẳng định ( tuổi >= 0)

Nếu mã đã kiểm tra điều kiện, bạn sử dụng hàm Float94 để chỉ ra rằng một xác nhận không thành công. Ví dụ

  1. nếu tuổi > 10 {
  2. print ( "Bạn có thể đi tàu lượn siêu tốc hoặc đu quay. " )
  3. } khác nếu tuổi >= 0 {
  4. print ( "Bạn có thể đi đu quay. " )
  5. } khác {
  6. assertionFailure ( "Tuổi của một người không được nhỏ hơn 0. " )
  7. }

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 Float95. Bạn truyền vào hàm này một biểu thức đánh giá thành Double53 hoặc Double54 và một thông báo sẽ hiển thị nếu kết quả của điều kiện là Double54. Ví dụ

  1. // Trong quá trình triển khai một chỉ số
  2. đ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 Float99 để 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 Bool01 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 Bool01 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 Bool03 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