Hướng dẫn swift html - html nhanh chóng

Một tour du lịch nhanh chóng

Truyền thống gợi ý rằng chương trình đầu tiên bằng ngôn ngữ mới nên in các từ Hello Hello, thế giới! trên màn hình. Trong Swift, điều này có thể được thực hiện trong một dòng duy nhất:

  1. In ("Xin chào, Thế giới!")("Hello, world!")
  2. // In "Xin chào, Thế giới!"

Nếu bạn có mã bằng văn bản trong C hoặc Objective-C, cú pháp này có vẻ quen thuộc với bạn trong Swift, dòng mã này là một chương trình hoàn chỉnh. Bạn không cần nhập một thư viện riêng cho chức năng như đầu vào/đầu ra hoặc xử lý chuỗi. Mã được viết ở phạm vi toàn cầu được sử dụng làm điểm nhập cảnh cho chương trình, vì vậy bạn không cần chức năng main(). Bạn cũng không cần phải viết dấu chấm phẩy vào cuối mỗi tuyên bố.

Chuyến tham quan này cung cấp cho bạn đủ thông tin để bắt đầu viết mã trong Swift bằng cách chỉ cho bạn cách hoàn thành nhiều nhiệm vụ lập trình. Don Tiết lo lắng nếu bạn không hiểu điều gì đó, mọi thứ được giới thiệu trong chuyến lưu diễn này đều được giải thích chi tiết trong phần còn lại của cuốn sách này.

Ghi chú

Để có trải nghiệm tốt nhất, hãy mở chương này như một sân chơi trong Xcode. Sân chơi cho phép bạn chỉnh sửa danh sách mã và xem kết quả ngay lập tức.

Tải xuống sân chơi

Giá trị đơn giản

Sử dụng let để tạo hằng số và var để tạo một biến. Giá trị của một hằng số không cần phải được biết đến tại thời điểm biên dịch, nhưng bạn phải gán cho nó một giá trị chính xác một lần. Điều này có nghĩa là bạn có thể sử dụng các hằng số để đặt tên cho một giá trị mà bạn xác định một lần nhưng sử dụng ở nhiều nơi.

  1. varmyvarable = 42 myVariable = 42
  2. myvarable = 50 = 50
  3. letMyConstant = 42 myConstant = 42

Một hằng hoặc biến phải có cùng loại với giá trị bạn muốn gán cho nó. Tuy nhiên, bạn không phải lúc nào cũng phải viết loại một cách rõ ràng. Cung cấp một giá trị khi bạn tạo một không đổi hoặc biến cho phép trình biên dịch suy ra loại của nó. Trong ví dụ trên, trình biên dịch thông tin rằng myVariable là một số nguyên vì giá trị ban đầu của nó là một số nguyên.

Nếu giá trị ban đầu không cung cấp đủ thông tin (hoặc nếu có một giá trị ban đầu), hãy chỉ định loại bằng cách viết nó sau biến, được phân tách bằng dấu hai chấm.

  1. letImplicitInteger = 70 implicitInteger = 70
  2. letImplicitDouble = 70.0 implicitDouble = 70.0
  3. LetExplicitDouble: Double = 70 explicitDouble: Double = 70

Cuộc thí nghiệm

Tạo một hằng số với một loại Float rõ ràng và giá trị là 4.

Các giá trị không bao giờ được chuyển đổi hoàn toàn sang loại khác. Nếu bạn cần chuyển đổi một giá trị thành một loại khác, rõ ràng sẽ tạo một thể hiện của loại mong muốn.

  1. LetLabel = "Chiều rộng là" label = "The width is "
  2. letWidth = 94 width = 94
  3. letWidthLabel = Label + String (Width) widthLabel = label + String(width)

Cuộc thí nghiệm

Tạo một hằng số với một loại Float rõ ràng và giá trị là 4.

Các giá trị không bao giờ được chuyển đổi hoàn toàn sang loại khác. Nếu bạn cần chuyển đổi một giá trị thành một loại khác, rõ ràng sẽ tạo một thể hiện của loại mong muốn.

  1. LetLabel = "Chiều rộng là" apples = 3
  2. letWidth = 94 oranges = 5
  3. letWidthLabel = Label + String (Width) appleSummary = "I have \(apples) apples."
  4. Hãy thử loại bỏ chuyển đổi thành String khỏi dòng cuối cùng. lỗi gì bạn nhận được? fruitSummary = "I have \(apples + oranges) pieces of fruit."

Cuộc thí nghiệm

Tạo một hằng số với một loại Float rõ ràng và giá trị là 4.

Các giá trị không bao giờ được chuyển đổi hoàn toàn sang loại khác. Nếu bạn cần chuyển đổi một giá trị thành một loại khác, rõ ràng sẽ tạo một thể hiện của loại mong muốn.

  1. LetLabel = "Chiều rộng là" quotation = """
  2. letWidth = 94\(apples) apples."
  3. letWidthLabel = Label + String (Width)\(apples + oranges) pieces of fruit."
  4. Hãy thử loại bỏ chuyển đổi thành String khỏi dòng cuối cùng. lỗi gì bạn nhận được?

Có một cách thậm chí đơn giản hơn để bao gồm các giá trị trong các chuỗi: viết giá trị trong ngoặc đơn và viết dấu gạch chéo ngược (\) trước dấu ngoặc đơn. Ví dụ:

  1. LetApples = 3 fruits = ["strawberries", "limes", "tangerines"]
  2. Letoranges = 5[1] = "grapes"
  3. letApplesummary = "Tôi có \ (táo) táo." occupations = [
  4. letfruitsummary = "Tôi có \ (táo + cam) miếng trái cây.": "Captain",
  5. Sử dụng \() để bao gồm tính toán dấu phẩy động trong một chuỗi và để bao gồm tên của ai đó trong một lời chào.: "Mechanic",
  6. Sử dụng ba dấu ngoặc kép (""") cho các chuỗi chiếm nhiều dòng. Thắng ở đầu mỗi dòng được trích dẫn được loại bỏ, miễn là nó phù hợp với vết lõm của các dấu ngoặc kép đóng. Ví dụ:
  7. letquotation = "" "["Jayne"] = "Public Relations"

Tôi nói "Tôi có \ (táo) táo."

  1. Và sau đó tôi đã nói "Tôi có \ (táo + cam) các miếng trái cây.".append("blueberries")
  2. "" "(fruits)

Tạo các mảng và từ điển bằng cách sử dụng dấu ngoặc (____10) và truy cập các yếu tố của chúng bằng cách viết chỉ mục hoặc khóa trong ngoặc. Một dấu phẩy được cho phép sau phần tử cuối cùng.

  1. varfruits = ["dâu tây", "chanh", "quýt"]]] emptyArray: [String] = []
  2. Trái cây [1] = "Nho" emptyDictionary: [String: Float] = [:]

Biến thể = [

  1. "Malcolm": "Thuyền trưởng", = []
  2. "Kaylee": "thợ máy", = [:]

]

Nghề nghiệp ["Jayne"] = "Quan hệ công chúng"

  1. Mảng tự động phát triển khi bạn thêm các yếu tố. individualScores = [75, 43, 103, 87, 12]
  2. trái cây.Append ("quả việt quất") teamScore = 0
  3. in (trái cây) score in individualScores {
  4. Để tạo một mảng trống hoặc từ điển, hãy sử dụng cú pháp khởi tạo. score > 50 {
  5. LetEmpTyArray: [String] = [] += 3
  6. letEmptyDictionary: [chuỗi: float] = [:]else {
  7. Nếu thông tin loại có thể được suy ra, bạn có thể viết một mảng trống là let0 và từ điển trống là ____ 12, ví dụ, khi bạn đặt giá trị mới cho một biến hoặc chuyển đối số cho một hàm. += 1
  8. trái cây = []
  9. nghề nghiệp = [:]
  10. Kiểm soát dòng chảy¶(teamScore)
  11. Sử dụng let3 và let4 để tạo ra các điều kiện và sử dụng ________ 15 -____ 16, let7 và ________ 18 -________ 17 để tạo vòng lặp. Điểm dừng xung quanh điều kiện hoặc biến vòng lặp là tùy chọn. Niềng răng xung quanh cơ thể là bắt buộc.

LetIndentualScores = [75, 43, 103, 87, 12]

Bạn có thể sử dụng let3 và let cùng nhau để làm việc với các giá trị có thể bị thiếu. Các giá trị này được biểu diễn dưới dạng tùy chọn. Một giá trị tùy chọn chứa một giá trị hoặc chứa var4 để chỉ ra rằng một giá trị bị thiếu. Viết một dấu câu hỏi (var5) sau loại giá trị để đánh dấu giá trị là tùy chọn.

  1. varoptionalstring: chuỗi? = "Xin chào" optionalString: String? = "Hello"
  2. In (Tùy chọnString == NIL)(optionalString == nil)
  3. // In "Sai"
  4. varoptionalname: chuỗi? = "John Appleseed" optionalName: String? = "John Appleseed"
  5. vargreeting = "Xin chào!" greeting = "Hello!"
  6. ifletName = tùy chọnAlName { let name = optionalName {
  7. Lời chào = "Xin chào, \ (tên)" = "Hello, \(name)"
  8. }

Cuộc thí nghiệm

Thay đổi var6 thành var4. Bạn nhận được lời chào nào? Thêm một mệnh đề var8 đặt một lời chào khác nhau nếu var6 là var4.

Nếu giá trị tùy chọn là var4, có điều kiện là myVariable2 và mã trong niềng răng bị bỏ qua. Mặt khác, giá trị tùy chọn được mở ra và được gán cho hằng số sau let, làm cho giá trị chưa được kiểm soát có sẵn bên trong khối mã.

Một cách khác để xử lý các giá trị tùy chọn là cung cấp giá trị mặc định bằng toán tử myVariable4. Nếu giá trị tùy chọn bị thiếu, giá trị mặc định được sử dụng thay thế.

  1. LetNickName: Chuỗi? = nil nickname: String? = nil
  2. Letfullname: String = "John Appleseed" fullName: String = "John Appleseed"
  3. letInformalGreeting = "Hi \ (biệt danh ?? fullName)" informalGreeting = "Hi \(nickname ?? fullName)"

Bạn có thể sử dụng cách đánh vần ngắn hơn để mở ra một giá trị, sử dụng cùng tên cho giá trị chưa được ghi nhận đó.

  1. ifletnickname { let nickname {
  2. in ("hey, \ (biệt danh)")("Hey, \(nickname)")
  3. }

Cuộc thí nghiệm

  1. Thay đổi var6 thành var4. Bạn nhận được lời chào nào? Thêm một mệnh đề var8 đặt một lời chào khác nhau nếu var6 là var4. vegetable = "red pepper"
  2. Nếu giá trị tùy chọn là var4, có điều kiện là myVariable2 và mã trong niềng răng bị bỏ qua. Mặt khác, giá trị tùy chọn được mở ra và được gán cho hằng số sau let, làm cho giá trị chưa được kiểm soát có sẵn bên trong khối mã. vegetable {
  3. Một cách khác để xử lý các giá trị tùy chọn là cung cấp giá trị mặc định bằng toán tử myVariable4. Nếu giá trị tùy chọn bị thiếu, giá trị mặc định được sử dụng thay thế. "celery":
  4. LetNickName: Chuỗi? = nil("Add some raisins and make ants on a log.")
  5. Letfullname: String = "John Appleseed" "cucumber", "watercress":
  6. letInformalGreeting = "Hi \ (biệt danh ?? fullName)"("That would make a good tea sandwich.")
  7. Bạn có thể sử dụng cách đánh vần ngắn hơn để mở ra một giá trị, sử dụng cùng tên cho giá trị chưa được ghi nhận đó. let x where x.hasSuffix("pepper"):
  8. ifletnickname {("Is it a spicy \(x)?")
  9. in ("hey, \ (biệt danh)"):
  10. Các công tắc hỗ trợ bất kỳ loại dữ liệu nào và nhiều hoạt động so sánh khác nhau, họ không giới hạn ở các số nguyên và các bài kiểm tra cho sự bình đẳng.("Everything tastes good in soup.")
  11. }
  12. Cuộc thí nghiệm

Thay đổi var6 thành var4. Bạn nhận được lời chào nào? Thêm một mệnh đề var8 đặt một lời chào khác nhau nếu var6 là var4.

Nếu giá trị tùy chọn là var4, có điều kiện là myVariable2 và mã trong niềng răng bị bỏ qua. Mặt khác, giá trị tùy chọn được mở ra và được gán cho hằng số sau let, làm cho giá trị chưa được kiểm soát có sẵn bên trong khối mã.

Một cách khác để xử lý các giá trị tùy chọn là cung cấp giá trị mặc định bằng toán tử myVariable4. Nếu giá trị tùy chọn bị thiếu, giá trị mặc định được sử dụng thay thế.

LetNickName: Chuỗi? = nil

Letfullname: String = "John Appleseed"

  1. letInformalGreeting = "Hi \ (biệt danh ?? fullName)" interestingNumbers = [
  2. Bạn có thể sử dụng cách đánh vần ngắn hơn để mở ra một giá trị, sử dụng cùng tên cho giá trị chưa được ghi nhận đó.: [2, 3, 5, 7, 11, 13],
  3. ifletnickname {: [1, 1, 2, 3, 5, 8],
  4. in ("hey, \ (biệt danh)"): [1, 4, 9, 16, 25],
  5. Các công tắc hỗ trợ bất kỳ loại dữ liệu nào và nhiều hoạt động so sánh khác nhau, họ không giới hạn ở các số nguyên và các bài kiểm tra cho sự bình đẳng.
  6. letvegetable = "Red Pepper" largest = 0
  7. SwitchveGetable { (_, numbers) in interestingNumbers {
  8. trường hợp "cần tây": number in numbers {
  9. In ("Thêm một số nho khô và làm kiến ​​trên nhật ký.") number > largest {
  10. trường hợp "dưa chuột", "cải xoong": = number
  11. In ("Điều đó sẽ tạo ra một chiếc bánh sandwich trà ngon.")
  12. In ("Điều đó sẽ tạo ra một chiếc bánh sandwich trà ngon.")
  13. }
  14. Cuộc thí nghiệm(largest)
  15. Thay đổi var6 thành var4. Bạn nhận được lời chào nào? Thêm một mệnh đề var8 đặt một lời chào khác nhau nếu var6 là var4.

Cuộc thí nghiệm

Thay đổi var6 thành var4. Bạn nhận được lời chào nào? Thêm một mệnh đề var8 đặt một lời chào khác nhau nếu var6 là var4.

Nếu giá trị tùy chọn là var4, có điều kiện là myVariable2 và mã trong niềng răng bị bỏ qua. Mặt khác, giá trị tùy chọn được mở ra và được gán cho hằng số sau let, làm cho giá trị chưa được kiểm soát có sẵn bên trong khối mã.

  1. Một cách khác để xử lý các giá trị tùy chọn là cung cấp giá trị mặc định bằng toán tử myVariable4. Nếu giá trị tùy chọn bị thiếu, giá trị mặc định được sử dụng thay thế. n = 2
  2. LetNickName: Chuỗi? = nil n < 100 {
  3. Letfullname: String = "John Appleseed" *= 2
  4. }
  5. Cuộc thí nghiệm(n)
  6. Thay đổi var6 thành var4. Bạn nhận được lời chào nào? Thêm một mệnh đề var8 đặt một lời chào khác nhau nếu var6 là var4.
  7. Nếu giá trị tùy chọn là var4, có điều kiện là myVariable2 và mã trong niềng răng bị bỏ qua. Mặt khác, giá trị tùy chọn được mở ra và được gán cho hằng số sau let, làm cho giá trị chưa được kiểm soát có sẵn bên trong khối mã. m = 2
  8. Một cách khác để xử lý các giá trị tùy chọn là cung cấp giá trị mặc định bằng toán tử myVariable4. Nếu giá trị tùy chọn bị thiếu, giá trị mặc định được sử dụng thay thế. {
  9. LetNickName: Chuỗi? = nil *= 2
  10. Letfullname: String = "John Appleseed"while m < 100
  11. letInformalGreeting = "Hi \ (biệt danh ?? fullName)"(m)
  12. Thay đổi var6 thành var4. Bạn nhận được lời chào nào? Thêm một mệnh đề var8 đặt một lời chào khác nhau nếu var6 là var4.

Nếu giá trị tùy chọn là var4, có điều kiện là myVariable2 và mã trong niềng răng bị bỏ qua. Mặt khác, giá trị tùy chọn được mở ra và được gán cho hằng số sau let, làm cho giá trị chưa được kiểm soát có sẵn bên trong khối mã.

  1. Một cách khác để xử lý các giá trị tùy chọn là cung cấp giá trị mặc định bằng toán tử myVariable4. Nếu giá trị tùy chọn bị thiếu, giá trị mặc định được sử dụng thay thế. total = 0
  2. foriin0.. i in 0..<4 {
  3. LetNickName: Chuỗi? = nil += i
  4. }
  5. Cuộc thí nghiệm(total)
  6. Thay đổi var6 thành var4. Bạn nhận được lời chào nào? Thêm một mệnh đề var8 đặt một lời chào khác nhau nếu var6 là var4.

Nếu giá trị tùy chọn là var4, có điều kiện là myVariable2 và mã trong niềng răng bị bỏ qua. Mặt khác, giá trị tùy chọn được mở ra và được gán cho hằng số sau let, làm cho giá trị chưa được kiểm soát có sẵn bên trong khối mã.

Một cách khác để xử lý các giá trị tùy chọn là cung cấp giá trị mặc định bằng toán tử myVariable4. Nếu giá trị tùy chọn bị thiếu, giá trị mặc định được sử dụng thay thế.

LetNickName: Chuỗi? = nil

  1. Letfullname: String = "John Appleseed" greet(person: String, day: String) -> String {
  2. letInformalGreeting = "Hi \ (biệt danh ?? fullName)" "Hello \(person), today is \(day)."
  3. }
  4. Cuộc thí nghiệm(person: "Bob", day: "Tuesday")

Cuộc thí nghiệm

Thay đổi var6 thành var4. Bạn nhận được lời chào nào? Thêm một mệnh đề var8 đặt một lời chào khác nhau nếu var6 là var4.

Nếu giá trị tùy chọn là var4, có điều kiện là myVariable2 và mã trong niềng răng bị bỏ qua. Mặt khác, giá trị tùy chọn được mở ra và được gán cho hằng số sau let, làm cho giá trị chưa được kiểm soát có sẵn bên trong khối mã.

  1. Một cách khác để xử lý các giá trị tùy chọn là cung cấp giá trị mặc định bằng toán tử myVariable4. Nếu giá trị tùy chọn bị thiếu, giá trị mặc định được sử dụng thay thế. greet(_ person: String, on day: String) -> String {
  2. letInformalGreeting = "Hi \ (biệt danh ?? fullName)" "Hello \(person), today is \(day)."
  3. }
  4. Bạn có thể sử dụng cách đánh vần ngắn hơn để mở ra một giá trị, sử dụng cùng tên cho giá trị chưa được ghi nhận đó.("John", on: "Wednesday")

ifletnickname {

  1. in ("hey, \ (biệt danh)") calculateStatistics(scores: [Int]) -> (min: Int, max: Int, sum: Int) {
  2. Các công tắc hỗ trợ bất kỳ loại dữ liệu nào và nhiều hoạt động so sánh khác nhau, họ không giới hạn ở các số nguyên và các bài kiểm tra cho sự bình đẳng. min = scores[0]
  3. letvegetable = "Red Pepper" max = scores[0]
  4. SwitchveGetable { sum = 0
  5. trường hợp "cần tây": score in scores {
  6. In ("Thêm một số nho khô và làm kiến ​​trên nhật ký.") score > max {
  7. trường hợp "dưa chuột", "cải xoong": = score
  8. } otherifscore else if score < min {
  9. Min = Điểm = score
  10. }
  11. sum += điểm += score
  12. }
  13. sum += điểm (min, max, sum)
  14. trả lại (tối thiểu, tối đa, tổng)
  15. } statistics = calculateStatistics(scores: [5, 3, 100, 3, 9])
  16. LetStatistic = Tính toán (điểm số: [5, 3, 100, 3, 9]))(statistics.sum)
  17. in (thống kê.sum)
  18. // In "120"(statistics.2)
  19. in (thống kê.sum)

// In "120"

  1. In (Thống kê.2) returnFifteen() -> Int {
  2. Các chức năng có thể được lồng nhau. Các hàm lồng nhau có quyền truy cập vào các biến được khai báo ở hàm bên ngoài. Bạn có thể sử dụng các chức năng lồng nhau để sắp xếp mã trong một hàm mà Long Long hoặc phức tạp. y = 10
  3. funcreturnfifteen () -> int { add() {
  4. thay đổi = 10 += 5
  5. }
  6. sum += điểm()
  7. trả lại (tối thiểu, tối đa, tổng) y
  8. trả lại (tối thiểu, tối đa, tổng)
  9. }()

LetStatistic = Tính toán (điểm số: [5, 3, 100, 3, 9]))

  1. in (thống kê.sum) makeIncrementer() -> ((Int) -> Int) {
  2. // In "120" addOne(number: Int) -> Int {
  3. In (Thống kê.2) 1 + number
  4. }
  5. Các chức năng có thể được lồng nhau. Các hàm lồng nhau có quyền truy cập vào các biến được khai báo ở hàm bên ngoài. Bạn có thể sử dụng các chức năng lồng nhau để sắp xếp mã trong một hàm mà Long Long hoặc phức tạp. addOne
  6. trả lại (tối thiểu, tối đa, tổng)
  7. } increment = makeIncrementer()
  8. LetStatistic = Tính toán (điểm số: [5, 3, 100, 3, 9]))(7)

in (thống kê.sum)

  1. // In "120" hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool {
  2. In (Thống kê.2) item in list {
  3. Các chức năng có thể được lồng nhau. Các hàm lồng nhau có quyền truy cập vào các biến được khai báo ở hàm bên ngoài. Bạn có thể sử dụng các chức năng lồng nhau để sắp xếp mã trong một hàm mà Long Long hoặc phức tạp. condition(item) {
  4. funcreturnfifteen () -> int { true
  5. }
  6. }
  7. thay đổi = 10 false
  8. trả lại (tối thiểu, tối đa, tổng)
  9. } lessThanTen(number: Int) -> Bool {
  10. LetStatistic = Tính toán (điểm số: [5, 3, 100, 3, 9])) number < 10
  11. trả lại (tối thiểu, tối đa, tổng)
  12. } numbers = [20, 19, 7, 12]
  13. LetStatistic = Tính toán (điểm số: [5, 3, 100, 3, 9]))(list: numbers, condition: lessThanTen)

in (thống kê.sum)

  1. // In "120".map({ (number: Int) -> Int in
  2. In (Thống kê.2) result = 3 * number
  3. Các chức năng có thể được lồng nhau. Các hàm lồng nhau có quyền truy cập vào các biến được khai báo ở hàm bên ngoài. Bạn có thể sử dụng các chức năng lồng nhau để sắp xếp mã trong một hàm mà Long Long hoặc phức tạp. result
  4. funcreturnfifteen () -> int {

thay đổi = 10

funcadd () {

y += 5

  1. cộng() mappedNumbers = numbers.map({ number in 3 * number })
  2. trở lại(mappedNumbers)
  3. returnFifteen ()

Chức năng là một loại hạng nhất. Điều này có nghĩa là một hàm có thể trả về một hàm khác là giá trị của nó.

  1. funcmakeincrementers () -> ((int) -> int) { sortedNumbers = numbers.sorted { $0 > $1 }
  2. funcaddone (số: int) -> int {(sortedNumbers)
  3. return1 + số

returnAddone

varincrement = makeincrementerer ()

  1. Tăng (7) Shape {
  2. Một chức năng có thể lấy một chức năng khác là một trong những đối số của nó. numberOfSides = 0
  3. funchasanymatches (danh sách: [int], điều kiện: (int) -> bool) -> bool { simpleDescription() -> String {
  4. foriteminlist { "A shape with \(numberOfSides) sides."
  5. }
  6. trả lại (tối thiểu, tối đa, tổng)

ifcondition (mục) {

trở lại

returnFalse

  1. funclessthanten (số: int) -> bool { shape = Shape()
  2. ReturnNumber <10.numberOfSides = 7
  3. varnumbers = [20, 19, 7, 12] shapeDescription = shape.simpleDescription()

Hasanymatches (Danh sách: Số, Điều kiện: Superthanten)

  1. Các chức năng thực sự là một trường hợp đặc biệt của các đóng cửa: các khối mã có thể được gọi sau này. Mã trong một đóng cửa có quyền truy cập vào những thứ như các biến và chức năng có sẵn trong phạm vi mà việc đóng được tạo, ngay cả khi việc đóng ở một phạm vi khác khi nó thực hiện, bạn đã thấy một ví dụ về điều này đã có chức năng lồng nhau. Bạn có thể viết đóng cửa mà không có tên bằng mã xung quanh bằng niềng răng (Float7). Sử dụng let6 để tách các đối số và trả về loại khỏi cơ thể. NamedShape {
  2. number.map ({(số: int) -> intin numberOfSides: Int = 0
  3. LetResult = 3 * Số name: String
  4. Trả lại(name: String) {
  5. }).name = name
  6. }
  7. funchasanymatches (danh sách: [int], điều kiện: (int) -> bool) -> bool { simpleDescription() -> String {
  8. foriteminlist { "A shape with \(numberOfSides) sides."
  9. }
  10. trả lại (tối thiểu, tối đa, tổng)

ifcondition (mục) {

trở lại

returnFalse

funclessthanten (số: int) -> bool {

  1. ClassSquare: Được đặt tên là { Square: NamedShape {
  2. varsidelpt: gấp đôi sideLength: Double
  3. init (sidelpt: gấp đôi, tên: chuỗi) {(sideLength: Double, name: String) {
  4. self.sidelpt = sidelpt.sideLength = sideLength
  5. Super.init (Tên: Tên).init(name: name)
  6. NumberOfsides = 4 = 4
  7. }
  8. funcarea () -> double { area() -> Double {
  9. returnSidelEnt * sidelpt sideLength * sideLength
  10. }
  11. funcarea () -> double { func simpleDescription() -> String {
  12. returnSidelEnt * sidelpt "A square with sides of length \(sideLength)."
  13. }
  14. funcarea () -> double {
  15. returnSidelEnt * sidelpt test = Square(sideLength: 5.2, name: "my test square")
  16. GhierRideFuncSImpledescrip () -> Chuỗi {.area()
  17. Trả về "Một hình vuông với các cạnh có độ dài \ (sidelpt).".simpleDescription()

}

Lettest = Square (Sidelpt: 5.2, Tên: "Quảng trường thử nghiệm của tôi")

test.area ()

  1. test.simpledescrip () EquilateralTriangle: NamedShape {
  2. Cuộc thí nghiệm sideLength: Double = 0.0
  3. init (sidelpt: gấp đôi, tên: chuỗi) {(sideLength: Double, name: String) {
  4. self.sidelpt = sidelpt.sideLength = sideLength
  5. Super.init (Tên: Tên).init(name: name)
  6. NumberOfsides = 4 = 3
  7. }
  8. funcarea () -> double { perimeter: Double {
  9. returnSidelEnt * sidelpt {
  10. GhierRideFuncSImpledescrip () -> Chuỗi { 3.0 * sideLength
  11. }
  12. funcarea () -> double { {
  13. returnSidelEnt * sidelpt = newValue / 3.0
  14. }
  15. }
  16. funcarea () -> double { func simpleDescription() -> String {
  17. returnSidelEnt * sidelpt "An equilateral triangle with sides of length \(sideLength)."
  18. }
  19. funcarea () -> double {
  20. returnSidelEnt * sidelpt triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")
  21. GhierRideFuncSImpledescrip () -> Chuỗi {(triangle.perimeter)
  22. Trả về "Một hình vuông với các cạnh có độ dài \ (sidelpt)."
  23. }.perimeter = 9.9
  24. Lettest = Square (Sidelpt: 5.2, Tên: "Quảng trường thử nghiệm của tôi")(triangle.sideLength)
  25. test.area ()

test.simpledescrip ()

Cuộc thí nghiệm

  1. Tạo một lớp con khác của String2 được gọi là String3 lấy bán kính và tên làm đối số cho trình khởi tạo của nó. Thực hiện phương thức String4 và String5 trên lớp String3.

  2. Ngoài các thuộc tính đơn giản được lưu trữ, các thuộc tính có thể có một getter và một setter.

  3. clasingingermateraltriangle: Được đặt tên là {

varsidelpt: double = 0,0

  1. NumberOfsides = 3 TriangleAndSquare {
  2. Varperimeter: Double { triangle: EquilateralTriangle {
  3. lấy { {
  4. return3.0 * sidelEnt.sideLength = newValue.sideLength
  5. }
  6. }
  7. funcarea () -> double { square: Square {
  8. lấy { {
  9. return3.0 * sidelEnt.sideLength = newValue.sideLength
  10. }
  11. }
  12. funcarea () -> double {(size: Double, name: String) {
  13. returnSidelEnt * sidelpt = Square(sideLength: size, name: name)
  14. GhierRideFuncSImpledescrip () -> Chuỗi { = EquilateralTriangle(sideLength: size, name: name)
  15. }
  16. funcarea () -> double {
  17. returnSidelEnt * sidelpt triangleAndSquare = TriangleAndSquare(size: 10, name: "another test shape")
  18. GhierRideFuncSImpledescrip () -> Chuỗi {(triangleAndSquare.square.sideLength)
  19. Trả về "Một hình vuông với các cạnh có độ dài \ (sidelpt)."
  20. }(triangleAndSquare.triangle.sideLength)
  21. Trả về "Một hình vuông với các cạnh có độ dài \ (sidelpt)."
  22. }.square = Square(sideLength: 50, name: "larger square")
  23. }(triangleAndSquare.triangle.sideLength)
  24. Lettest = Square (Sidelpt: 5.2, Tên: "Quảng trường thử nghiệm của tôi")

test.area ()

  1. test.simpledescrip () optionalSquare: Square? = Square(sideLength: 2.5, name: "optional square")
  2. Cuộc thí nghiệm sideLength = optionalSquare?.sideLength

Tạo một lớp con khác của String2 được gọi là String3 lấy bán kính và tên làm đối số cho trình khởi tạo của nó. Thực hiện phương thức String4 và String5 trên lớp String3.

Ngoài các thuộc tính đơn giản được lưu trữ, các thuộc tính có thể có một getter và một setter.

  1. clasingingermateraltriangle: Được đặt tên là { Rank: Int {
  2. varsidelpt: double = 0,0 ace = 1
  3. NumberOfsides = 3 two, three, four, five, six, seven, eight, nine, ten
  4. Varperimeter: Double { jack, queen, king
  5. lấy { simpleDescription() -> String {
  6. return3.0 * sidelEnt self {
  7. bộ { .ace:
  8. return"ace" "ace"
  9. sidelpt = newValue / 3.0 .jack:
  10. return"jack" "jack"
  11. Trả về "Một hình tam giác đều có các cạnh có chiều dài \ (sidel bước)." .queen:
  12. return"queen" "queen"
  13. vartriangle = CquilWoralTriangle (sidelpt: 3.1, tên: "một tam giác") .king:
  14. return"king" "king"
  15. in (tam giác.perimet):
  16. // In "9.3" String(self.rawValue)
  17. }
  18. }
  19. funcarea () -> double {
  20. returnSidelEnt * sidelpt ace = Rank.ace
  21. GhierRideFuncSImpledescrip () -> Chuỗi { aceRawValue = ace.rawValue

}

Lettest = Square (Sidelpt: 5.2, Tên: "Quảng trường thử nghiệm của tôi")

test.area ()

test.simpledescrip ()

  1. ifletConvertedRank = RANK (RAWVALUE: 3) { let convertedRank = Rank(rawValue: 3) {
  2. letThreedescrip = ConcressRedRank.Simpledescrip () threeDescription = convertedRank.simpleDescription()
  3. }

Các giá trị trường hợp của một bảng liệt kê là các giá trị thực tế, không chỉ là một cách khác để viết các giá trị thô của chúng. Trên thực tế, trong trường hợp có một giá trị thô có ý nghĩa, bạn không phải cung cấp một giá trị.

  1. enumsuit { Suit {
  2. Casespades, trái tim, kim cương, câu lạc bộ spades, hearts, diamonds, clubs
  3. funcsimpledescrip () -> Chuỗi { simpleDescription() -> String {
  4. tự switch { self {
  5. trường hợp .spades: .spades:
  6. return"spades" "spades"
  7. trường hợp .Hearts: .hearts:
  8. return"hearts" "hearts"
  9. trường hợp .diamonds: .diamonds:
  10. return"diamonds" "diamonds"
  11. trường hợp .clubs: .clubs:
  12. return"clubs" "clubs"
  13. }
  14. }
  15. }
  16. Các giá trị trường hợp của một bảng liệt kê là các giá trị thực tế, không chỉ là một cách khác để viết các giá trị thô của chúng. Trên thực tế, trong trường hợp có một giá trị thô có ý nghĩa, bạn không phải cung cấp một giá trị. hearts = Suit.hearts
  17. enumsuit { heartsDescription = hearts.simpleDescription()

Casespades, trái tim, kim cương, câu lạc bộ

funcsimpledescrip () -> Chuỗi {

tự switch {

trường hợp .spades:

  1. trường hợp .Hearts: ServerResponse {
  2. trường hợp .diamonds: result(String, String)
  3. trường hợp .clubs: failure(String)
  4. }
  5. } success = ServerResponse.result("6:00 am", "8:09 pm")
  6. Lethearts = Suit.hrearts failure = ServerResponse.failure("Out of cheese.")
  7. letheartsdescrip = hearts.simpledescrip () success {
  8. Cuộc thí nghiệm let .result(sunrise, sunset):
  9. Thêm một phương pháp \()7 vào \()8 trả về Đen Đen cho các câu lạc bộ và câu lạc bộ, và trả lại Red Red Red cho trái tim và kim cương.("Sunrise is at \(sunrise) and sunset is at \(sunset).")
  10. Lưu ý hai cách mà trường hợp \()9 của bảng liệt kê được đề cập ở trên: Khi gán giá trị cho hằng số \()9, trường hợp liệt kê """1 được gọi bằng tên đầy đủ của nó vì hằng số không có loại rõ ràng được chỉ định. Bên trong công tắc, trường hợp liệt kê được đề cập bởi dạng viết tắt """2 vì giá trị của 43 đã được biết đến là một bộ đồ. Bạn có thể sử dụng biểu mẫu viết tắt bất cứ khi nào loại giá trị đã được biết đến. let .failure(message):
  11. Nếu một bảng liệt kê có các giá trị thô, các giá trị đó được xác định là một phần của khai báo, điều đó có nghĩa là mọi trường hợp của một trường hợp liệt kê cụ thể luôn có cùng giá trị thô. Một lựa chọn khác cho các trường hợp liệt kê là có các giá trị liên quan đến trường hợp, các giá trị này được xác định khi bạn đưa ra thể hiện và chúng có thể khác nhau đối với từng trường hợp của một trường hợp liệt kê. Bạn có thể nghĩ về các giá trị liên quan như hành xử như các thuộc tính được lưu trữ của trường hợp trường hợp liệt kê. Ví dụ, hãy xem xét trường hợp yêu cầu Sunrise và Sunset Times từ một máy chủ. Máy chủ hoặc trả lời với thông tin được yêu cầu hoặc nó trả lời với một mô tả về những gì đã sai.("Failure... \(message)")
  12. }
  13. enumserverresponse {

Casespades, trái tim, kim cương, câu lạc bộ

funcsimpledescrip () -> Chuỗi {

tự switch {

trường hợp .spades:

  1. trường hợp .Hearts: Card {
  2. trường hợp .diamonds: rank: Rank
  3. trường hợp .clubs: suit: Suit
  4. funcsimpledescrip () -> Chuỗi { simpleDescription() -> String {
  5. tự switch { "The \(rank.simpleDescription()) of \(suit.simpleDescription())"
  6. }
  7. }
  8. Lethearts = Suit.hrearts threeOfSpades = Card(rank: .three, suit: .spades)
  9. letheartsdescrip = hearts.simpledescrip () threeOfSpadesDescription = threeOfSpades.simpleDescription()

Casespades, trái tim, kim cương, câu lạc bộ

funcsimpledescrip () -> Chuỗi {

tự switch {

trường hợp .spades:

  1. trường hợp .Hearts: fetchUserID(from server: String) async -> Int {
  2. trường hợp .diamonds: server == "primary" {
  3. return97 97
  4. }
  5. return501 501
  6. }

Lethearts = Suit.hrearts

  1. letheartsdescrip = hearts.simpledescrip () fetchUsername(from server: String) async -> String {
  2. Cuộc thí nghiệm userID = await fetchUserID(from: server)
  3. Thêm một phương pháp \()7 vào \()8 trả về Đen Đen cho các câu lạc bộ và câu lạc bộ, và trả lại Red Red Red cho trái tim và kim cương. userID == 501 {
  4. Lưu ý hai cách mà trường hợp \()9 của bảng liệt kê được đề cập ở trên: Khi gán giá trị cho hằng số \()9, trường hợp liệt kê """1 được gọi bằng tên đầy đủ của nó vì hằng số không có loại rõ ràng được chỉ định. Bên trong công tắc, trường hợp liệt kê được đề cập bởi dạng viết tắt """2 vì giá trị của 43 đã được biết đến là một bộ đồ. Bạn có thể sử dụng biểu mẫu viết tắt bất cứ khi nào loại giá trị đã được biết đến. "John Appleseed"
  5. }
  6. return"Guest" "Guest"
  7. }

Lethearts = Suit.hrearts

  1. letheartsdescrip = hearts.simpledescrip () connectUser(to server: String) async {
  2. Cuộc thí nghiệm let userID = fetchUserID(from: server)
  3. Thêm một phương pháp \()7 vào \()8 trả về Đen Đen cho các câu lạc bộ và câu lạc bộ, và trả lại Red Red Red cho trái tim và kim cương. let username = fetchUsername(from: server)
  4. Lưu ý hai cách mà trường hợp \()9 của bảng liệt kê được đề cập ở trên: Khi gán giá trị cho hằng số \()9, trường hợp liệt kê """1 được gọi bằng tên đầy đủ của nó vì hằng số không có loại rõ ràng được chỉ định. Bên trong công tắc, trường hợp liệt kê được đề cập bởi dạng viết tắt """2 vì giá trị của 43 đã được biết đến là một bộ đồ. Bạn có thể sử dụng biểu mẫu viết tắt bất cứ khi nào loại giá trị đã được biết đến. greeting = await "Hello \(username), user ID \(userID)"
  5. Nếu một bảng liệt kê có các giá trị thô, các giá trị đó được xác định là một phần của khai báo, điều đó có nghĩa là mọi trường hợp của một trường hợp liệt kê cụ thể luôn có cùng giá trị thô. Một lựa chọn khác cho các trường hợp liệt kê là có các giá trị liên quan đến trường hợp, các giá trị này được xác định khi bạn đưa ra thể hiện và chúng có thể khác nhau đối với từng trường hợp của một trường hợp liệt kê. Bạn có thể nghĩ về các giá trị liên quan như hành xử như các thuộc tính được lưu trữ của trường hợp trường hợp liệt kê. Ví dụ, hãy xem xét trường hợp yêu cầu Sunrise và Sunset Times từ một máy chủ. Máy chủ hoặc trả lời với thông tin được yêu cầu hoặc nó trả lời với một mô tả về những gì đã sai.(greeting)
  6. }

enumserverresponse {

  1. caseresult (chuỗi, chuỗi) {
  2. CASEFAILURE (Chuỗi) connectUser(to: "primary")
  3. }
  4. LetSucCess = ServerResponse.Result ("6:00 AM", "8:09 PM")

letFailure = serverResponse.failure ("Out of Cheese.")

SwitchSuccess {

  1. Caselet .Result (Mặt trời mọc, Sunset): ExampleProtocol {
  2. In ("Mặt trời mọc ở \ (mặt trời mọc) và hoàng hôn đang ở \ (hoàng hôn).") simpleDescription: String { get }
  3. caselet .failure (tin nhắn): func adjust()
  4. }

in ("thất bại ... \ (tin nhắn)")

  1. // Bản in "Mặt trời mọc lúc 6:00 sáng và hoàng hôn lúc 8:09 tối." SimpleClass: ExampleProtocol {
  2. Thêm một trường hợp thứ ba vào """4 và vào công tắc. simpleDescription: String = "A very simple class."
  3. Lưu ý cách Sunrise và Sunset Time được trích xuất từ ​​giá trị """4 như là một phần của việc phù hợp với giá trị với các trường hợp chuyển đổi. anotherProperty: Int = 69105
  4. funcadjust () { adjust() {
  5. SimpleDescrip += "Bây giờ điều chỉnh 100%." += " Now 100% adjusted."
  6. }
  7. }
  8. vara = SimpleClass () a = SimpleClass()
  9. A.Adjust ().adjust()
  10. Letadescrip = a.simpledescrip aDescription = a.simpleDescription
  11. structSimplest cấu trúc: exampleprotocol { SimpleStructure: ExampleProtocol {
  12. varsimplescrip: String = "một cấu trúc đơn giản" simpleDescription: String = "A simple structure"
  13. belatfuncadjust () { func adjust() {
  14. SimpleDescrip += "(Điều chỉnh)" += " (adjusted)"
  15. }
  16. }
  17. vara = SimpleClass () b = SimpleStructure()
  18. A.Adjust ().adjust()
  19. Letadescrip = a.simpledescrip bDescription = b.simpleDescription

structSimplest cấu trúc: exampleprotocol {

varsimplescrip: String = "một cấu trúc đơn giản"

belatfuncadjust () {

SimpleDescrip += "(Điều chỉnh)"

  1. varb = Simplest cấu trúc () Int: ExampleProtocol {
  2. B.ADJUST () simpleDescription: String {
  3. LetBdescrip = B.Simpledescrip "The number \(self)"
  4. }
  5. belatfuncadjust () { func adjust() {
  6. SimpleDescrip += "(Điều chỉnh)" += 42
  7. }
  8. }
  9. vara = SimpleClass ()(7.simpleDescription)
  10. A.Adjust ()

structSimplest cấu trúc: exampleprotocol {

varsimplescrip: String = "một cấu trúc đơn giản"

belatfuncadjust () {

  1. SimpleDescrip += "(Điều chỉnh)" protocolValue: ExampleProtocol = a
  2. varb = Simplest cấu trúc ()(protocolValue.simpleDescription)
  3. B.ADJUST ()
  4. LetBdescrip = B.Simpledescrip

Cuộc thí nghiệm

Thêm một yêu cầu khác vào let03. Những thay đổi nào bạn cần thực hiện đối với let04 và let05 để chúng vẫn phù hợp với giao thức?

Lưu ý rằng việc sử dụng từ khóa let06 trong khai báo let05 để đánh dấu một phương thức sửa đổi cấu trúc. Tuyên bố của let04 không cần bất kỳ phương pháp nào được đánh dấu là đột biến vì các phương thức trên một lớp luôn có thể sửa đổi lớp.

  1. Sử dụng let09 để thêm chức năng vào một loại hiện có, chẳng hạn như các phương thức mới và các thuộc tính được tính toán. Bạn có thể sử dụng một tiện ích mở rộng để thêm sự phù hợp của giao thức vào một loại mà LỚN đã khai báo ở nơi khác hoặc thậm chí vào một loại mà bạn đã nhập từ thư viện hoặc khung. PrinterError: Error {
  2. ExtensionInt: examprotocol { outOfPaper
  3. varsimplescrip: chuỗi { noToner
  4. Trả về "Số \ (tự)" onFire
  5. }

tự += 42

  1. In (7. Simpledescrip) send(job: Int, toPrinter printerName: String) throws -> String {
  2. // In "Số 7" printerName == "Never Has Toner" {
  3. throwPrinterError.noToner PrinterError.noToner
  4. }
  5. Viết tiện ích mở rộng cho loại let10 thêm thuộc tính let11. "Job sent"
  6. }

Ví dụ, bạn có thể sử dụng một tên giao thức giống như bất kỳ loại có tên nào khác, để tạo một tập hợp các đối tượng có các loại khác nhau nhưng tất cả đều phù hợp với một giao thức duy nhất. Khi bạn làm việc với các giá trị có loại là loại giao thức, các phương thức ngoài định nghĩa giao thức có sẵn.

  1. LOGROTOCOLVALUE: examprotocol = a {
  2. in (ProtocolValue.Simpledescrip) printerResponse = try send(job: 1040, toPrinter: "Bi Sheng")
  3. // In "Một lớp rất đơn giản. Bây giờ đã điều chỉnh 100%."(printerResponse)
  4. // in (protocolValue.AnotherProperty) // không biết để xem lỗicatch {
  5. Mặc dù biến let12 có loại thời gian chạy let04, trình biên dịch coi nó là loại let03 đã cho. Điều này có nghĩa là bạn có thể vô tình truy cập các phương thức hoặc thuộc tính mà lớp thực hiện ngoài sự phù hợp của giao thức.(error)
  6. }
  7. Xử lý lỗi

structSimplest cấu trúc: exampleprotocol {

varsimplescrip: String = "một cấu trúc đơn giản"

belatfuncadjust () {

  1. LOGROTOCOLVALUE: examprotocol = a {
  2. in (ProtocolValue.Simpledescrip) printerResponse = try send(job: 1440, toPrinter: "Gutenberg")
  3. // In "Một lớp rất đơn giản. Bây giờ đã điều chỉnh 100%."(printerResponse)
  4. // in (protocolValue.AnotherProperty) // không biết để xem lỗicatch PrinterError.onFire {
  5. Mặc dù biến let12 có loại thời gian chạy let04, trình biên dịch coi nó là loại let03 đã cho. Điều này có nghĩa là bạn có thể vô tình truy cập các phương thức hoặc thuộc tính mà lớp thực hiện ngoài sự phù hợp của giao thức.("I'll just put this over here, with the rest of the fire.")
  6. Xử lý lỗicatch let printerError as PrinterError {
  7. Bạn đại diện cho các lỗi bằng cách sử dụng bất kỳ loại nào áp dụng giao thức let15.("Printer error: \(printerError).")
  8. // in (protocolValue.AnotherProperty) // không biết để xem lỗicatch {
  9. Mặc dù biến let12 có loại thời gian chạy let04, trình biên dịch coi nó là loại let03 đã cho. Điều này có nghĩa là bạn có thể vô tình truy cập các phương thức hoặc thuộc tính mà lớp thực hiện ngoài sự phù hợp của giao thức.(error)
  10. }
  11. Xử lý lỗi

structSimplest cấu trúc: exampleprotocol {

varsimplescrip: String = "một cấu trúc đơn giản"

belatfuncadjust () {

  1. SimpleDescrip += "(Điều chỉnh)" printerSuccess = try? send(job: 1884, toPrinter: "Mergenthaler")
  2. varb = Simplest cấu trúc () printerFailure = try? send(job: 1885, toPrinter: "Never Has Toner")

B.ADJUST ()

  1. varfridgeisopen = false fridgeIsOpen = false
  2. letfridgecontent = ["sữa", "trứng", "thức ăn thừa"]]] fridgeContent = ["milk", "eggs", "leftovers"]
  3. funcfridgecontains (_food: chuỗi) -> bool { fridgeContains(_ food: String) -> Bool {
  4. tủ lạnh = true = true
  5. hoãn lại { {
  6. tủ lạnh = sai = false
  7. }
  8. letresult = fridgecontent.contains (thực phẩm) result = fridgeContent.contains(food)
  9. Trả lại result
  10. }
  11. fridgecontains ("chuối")("banana")
  12. In (Fridgeisopen)(fridgeIsOpen)
  13. // In "Sai"

Thuốc generics;

Viết một tên bên trong giá đỡ góc để tạo hàm hoặc loại chung.

  1. funcmakeArray (remeMeingItem: item, numberoftimes: int) -> [item] {{ makeArray<Item>(repeating item: Item, numberOfTimes: Int) -> [Item] {
  2. varresult: [mục] = [] result: [Item] = []
  3. for_in0.. _ in 0..<numberOfTimes {
  4. result.append (mục).append(item)
  5. }
  6. Trả lại result
  7. }
  8. fridgecontains ("chuối")(repeating: "knock", numberOfTimes: 4)

In (Fridgeisopen)

  1. // In "Sai"
  2. Thuốc generics; OptionalValue<Wrapped> {
  3. Viết một tên bên trong giá đỡ góc để tạo hàm hoặc loại chung. none
  4. funcmakeArray (remeMeingItem: item, numberoftimes: int) -> [item] {{ some(Wrapped)
  5. }
  6. fridgecontains ("chuối") possibleInteger: OptionalValue<Int> = .none
  7. In (Fridgeisopen) = .some(100)

// In "Sai"

  1. Thuốc generics; anyCommonElements<T: Sequence, U: Sequence>(_ lhs: T, _ rhs: U) -> Bool
  2. Viết một tên bên trong giá đỡ góc để tạo hàm hoặc loại chung. T.Element: Equatable, T.Element == U.Element
  3. funcmakeArray (remeMeingItem: item, numberoftimes: int) -> [item] {{
  4. varresult: [mục] = [] lhsItem in lhs {
  5. result.append (mục) rhsItem in rhs {
  6. Makearray (lặp lại: "gõ", numberoftimes: 4) lhsItem == rhsItem {
  7. Bạn có thể tạo các hình thức chung của các chức năng và phương pháp, cũng như các lớp, bảng liệt kê và cấu trúc. true
  8. }
  9. }
  10. }
  11. letresult = fridgecontent.contains (thực phẩm) false
  12. }
  13. fridgecontains ("chuối")([1, 2, 3], [3])

In (Fridgeisopen)

// In "Sai"

Thuốc generics;