#18_迴圈的練習

嗯?你就繼續轉

在剛開始學習 swift 時就覺得巢狀迴圈是很容易腦袋打結的事,經過這次的練習腦袋似乎有比較鬆一點?,這次是直接用 tab 配合 segment 的方式將大部份要實作的練習題都做出來,也是第一次嘗試幾乎都使用 code 來呈現 ( 除了 tab XD )

我自己的練習方式很直接,就是一直看著那些不斷重複的圖像直到我找到規律為止 XD,過程中將它們化成數字我覺得非常實用

1.1 1.2 1.3 1.4
2.1 2.2 2.3 2.4
3.1 3.2 3.3 3.4

諸如此類的,大部分都可以在橫排與縱排中找到規律,也就是

for r in 1...4 {
for c in 1...4{
// 放上 r & c 的條件,比如: if r % 2 == 0,之類的
}
}

最重要的是真的能看懂和了解,雖然我有一些解法跟彼得的不一樣,還被 AI 說我的比較冗🥲,但先有自己的解法再去看正解會比較有方向

乘法表 & 西洋棋

程式碼

// 九九乘法表

import UIKit

class MultiplicationTableViewController: UIViewController {

// 定義一個UIStackView,用於以堆疊的方式顯示內部視圖。
var mainStackView = UIStackView()

// viewDidLoad方法:當視圖控制器的視圖被加載到內存中後調用此方法。
override func viewDidLoad() {
super.viewDidLoad()

// 設置mainStackView的軸向為垂直,這意味著其內部視圖將垂直排列。
mainStackView.axis = .vertical
// 分配子視圖的佈局方式為等分佈。
mainStackView.distribution = .fillEqually
// 設置子視圖間的間距為1點。
mainStackView.spacing = 1
// 將autoresizing轉換成約束條件設為false,以便我們可以自定義約束。
mainStackView.translatesAutoresizingMaskIntoConstraints = false

// 將mainStackView添加到根視圖中。
view.addSubview(mainStackView)

// 使用約束條件來定位mainStackView,使其填滿安全區域。
NSLayoutConstraint.activate([
mainStackView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
mainStackView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor),
mainStackView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor),
mainStackView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor)
])

// 調用自定義方法來設置九九乘法表。
setupMultiplicationTable()
}



// MARK: - Function

// 自定義方法:設置九九乘法表。
func setupMultiplicationTable() {
// 雙重for迴圈來創建九九乘法表。
for r in 0...9 {
// 每一行創建一個水平的UIStackView。
let rowStackView = UIStackView()
rowStackView.axis = .horizontal
rowStackView.spacing = 1
rowStackView.distribution = .fillEqually

for c in 0...9 {
// 根據不同條件,創建不同背景和文本的UILabel。
// 下面的代碼塊會根據行列數來決定標籤的文本、背景色等。
if r + c == 0 {
let label = UILabel()
label.text = "X"
label.backgroundColor = .white
label.textColor = .black
label.textAlignment = .center
label.font = .boldSystemFont(ofSize: 20)
rowStackView.addArrangedSubview(label)

} else if r == 0 {
let label = UILabel()
label.text = String(c)
label.backgroundColor = .white
label.textColor = .black
label.textAlignment = .center
label.font = .boldSystemFont(ofSize: 20)
rowStackView.addArrangedSubview(label)

} else if c == 0 {
let label = UILabel()
label.text = String(r)
label.backgroundColor = .white
label.textColor = .black
label.textAlignment = .center
label.font = .boldSystemFont(ofSize: 20)
rowStackView.addArrangedSubview(label)

} else if r == 9 {
if c % 2 == 0 {
let label = UILabel()
label.text = String(r * c)
label.backgroundColor = .systemCyan
label.textColor = .black
label.textAlignment = .center
rowStackView.addArrangedSubview(label)
} else {
let label = UILabel()
label.text = String(r * c)
label.backgroundColor = .systemOrange
label.textColor = .black
label.textAlignment = .center
rowStackView.addArrangedSubview(label)
}

} else if r > 4 && r == c {
let label = UILabel()
label.text = String(r * c)
label.backgroundColor = .systemPink
label.textColor = .black
label.textAlignment = .center
rowStackView.addArrangedSubview(label)
} else if r > 4 && r + c == 10 {
let label = UILabel()
label.text = String(r * c)
label.backgroundColor = .systemPink
label.textColor = .black
label.textAlignment = .center
rowStackView.addArrangedSubview(label)
} else {
let label = UILabel()
label.text = String(r * c)
label.backgroundColor = .white
label.textColor = .black
label.textAlignment = .center
// 將標籤加入到行的UIStackView中。
rowStackView.addArrangedSubview(label)

}
}
// 將每一行的UIStackView加入到主UIStackView中。
mainStackView.addArrangedSubview(rowStackView)

}

}

}
// 西洋棋


import UIKit

class chessBoardViewController: UIViewController {


// 定義一個結構體chessPiece,用於表示棋盤上的棋子。
// 包含行(r),列(c),和表示棋子的圖像(image)。
struct chessPiece {
var r : Int
var c : [Int]
var image : String
}

// 一個包含所有棋子信息的陣列。
// 每個chessPiece實例包含棋子的行、列和圖示。
let pieces = [
chessPiece(r: 2, c: Array(1...8), image: "♟"), // 棋子的資訊
chessPiece(r: 1, c: [1, 8], image: "♜"),
chessPiece(r: 1, c: [2, 7], image: "♞"),
chessPiece(r: 1, c: [3, 6], image: "♝"),
chessPiece(r: 1, c: [4], image: "♛"),
chessPiece(r: 1, c: [5], image: "♚"),
chessPiece(r: 7, c: Array(1...8), image: "♙"),
chessPiece(r: 8, c: [1, 8], image: "♖"),
chessPiece(r: 8, c: [2, 7], image: "♘"),
chessPiece(r: 8, c: [3, 6], image: "♗"),
chessPiece(r: 8, c: [4], image: "♕"),
chessPiece(r: 8, c: [5], image: "♔")
]

// 定義主StackView和容器視圖。
var mainStackView: UIStackView!
var containerView: UIView!

// 當視圖控制器的視圖加載完畢後,調用此方法。
override func viewDidLoad() {
super.viewDidLoad()

// 創建容器視圖並設置其屬性。
containerView = UIView()
containerView.translatesAutoresizingMaskIntoConstraints = false
containerView.layer.borderWidth = 2
containerView.layer.borderColor = UIColor.darkGray.cgColor
view.addSubview(containerView)

// 為容器視圖添加約束條件。
NSLayoutConstraint.activate([
containerView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
containerView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
containerView.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 1),
containerView.heightAnchor.constraint(equalTo: view.widthAnchor, multiplier: 1)
])

// 創建主StackView並設置其屬性。
mainStackView = UIStackView()
mainStackView.axis = .vertical
mainStackView.distribution = .fillEqually
mainStackView.alignment = .fill
mainStackView.spacing = 1
mainStackView.translatesAutoresizingMaskIntoConstraints = false
containerView.addSubview(mainStackView)

// 為主StackView添加約束條件。
NSLayoutConstraint.activate([
mainStackView.topAnchor.constraint(equalTo: containerView.topAnchor),
mainStackView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor),
mainStackView.leadingAnchor.constraint(equalTo: containerView.leadingAnchor),
mainStackView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor)
])

// 調用函數設置棋盤。
setUpChessBoard()
}

// 函數:設置棋盤。
func setUpChessBoard() {
// 使用for迴圈來創建8x8的棋盤。
for r in 1...8 {
// 為每一行創建一個水平StackView。
let rowStackView = UIStackView()
rowStackView.axis = .horizontal
rowStackView.distribution = .fillEqually
rowStackView.spacing = 1

// 創建每一列的方塊。
for c in 1...8 {
let square = UIView()
square.translatesAutoresizingMaskIntoConstraints = false
// 根據行列數來決定方塊的顏色。
if (r + c) % 2 == 0 {
square.backgroundColor = .white
} else {
square.backgroundColor = .black
}

// 檢查是否有棋子位於該方塊上。
for piece in pieces {
if piece.r == r && piece.c.contains(c) {
// 創建一個標籤來顯示棋子圖示。
let chessPieceLabel = UILabel()
chessPieceLabel.translatesAutoresizingMaskIntoConstraints = false
chessPieceLabel.textAlignment = .center
chessPieceLabel.text = piece.image
chessPieceLabel.font = .systemFont(ofSize: 50)
chessPieceLabel.textColor = .brown
square.addSubview(chessPieceLabel)

// 為棋子標籤添加約束條件。
NSLayoutConstraint.activate([
chessPieceLabel.centerXAnchor.constraint(equalTo: square.centerXAnchor),
chessPieceLabel.centerYAnchor.constraint(equalTo: square.centerYAnchor),
chessPieceLabel.widthAnchor.constraint(equalTo: square.widthAnchor),
chessPieceLabel.heightAnchor.constraint(equalTo: square.heightAnchor)
])
}
}
// 將方塊添加到行的StackView中。
rowStackView.addArrangedSubview(square)
}
// 將行的StackView添加到主StackView中。
mainStackView.addArrangedSubview(rowStackView)
}
}
}
直線 / 斜線 / 梅花
正方形 / 三角形 / 金字塔 / 菱形

程式碼

// 各種形狀

import UIKit

class applerowViewController: UIViewController {

// 定義一些界面元素:滑動條、兩個標籤和一個分段控制器。
var rowSlider: UISlider!
var appleList: UILabel!
var sliderNumber: UILabel!
var segmentdevice1: UISegmentedControl!

// 用於跟踪分段控制器選項的索引。
var index = 0

// 當視圖控制器的視圖加載完畢後調用此方法。
override func viewDidLoad() {
super.viewDidLoad()

// 以下代碼區塊負責初始化和設置界面元素,包括滑動條、標籤和分段控制器。
// 設置滑動條屬性,添加到視圖中。
rowSlider = UISlider()
rowSlider.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(rowSlider)

// 設置蘋果列表標籤屬性,添加到視圖中。
appleList = UILabel()
appleList.translatesAutoresizingMaskIntoConstraints = false
appleList.numberOfLines = 0
view.addSubview(appleList)

// 設置滑動數字標籤屬性,添加到視圖中。
sliderNumber = UILabel()
sliderNumber.translatesAutoresizingMaskIntoConstraints = false
sliderNumber.textColor = .white
view.addSubview(sliderNumber)

// 初始化分段控制器,添加各個分段選項。
segmentdevice1 = UISegmentedControl()
// 添加各種圖形排列的選項,比如直線、斜線等。
segmentdevice1.insertSegment(withTitle: "直線", at: 0, animated: true)
// ... 其他分段選項
segmentdevice1.insertSegment(withTitle: "斜線", at: 1, animated: true)
segmentdevice1.insertSegment(withTitle: "梅花", at: 2, animated: true)
segmentdevice1.insertSegment(withTitle: "正方形", at: 3, animated: true)
segmentdevice1.insertSegment(withTitle: "三角形", at: 4, animated: true)
segmentdevice1.insertSegment(withTitle: "金字塔", at: 5, animated: true)
segmentdevice1.insertSegment(withTitle: "菱形", at: 6, animated: true)
segmentdevice1.selectedSegmentIndex = 0
segmentdevice1.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(segmentdevice1)



// 設置各個界面元素的約束條件,以確保它們在視圖中正確放置。
NSLayoutConstraint.activate([

rowSlider.centerXAnchor.constraint(equalTo: view.centerXAnchor),
rowSlider.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -200),
rowSlider.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.75),

appleList.centerXAnchor.constraint(equalTo: view.centerXAnchor),
appleList.centerYAnchor.constraint(equalTo: view.centerYAnchor),

sliderNumber.centerXAnchor.constraint(equalTo: view.centerXAnchor),
sliderNumber.bottomAnchor.constraint(equalTo: rowSlider.bottomAnchor, constant: 100),

segmentdevice1.centerXAnchor.constraint(equalTo: view.centerXAnchor),
segmentdevice1.topAnchor.constraint(equalTo: view.topAnchor, constant: 80),
segmentdevice1.widthAnchor.constraint(equalTo: view.widthAnchor)


])

// 設置滑動條的初始值、最大值、最小值等。
rowSlider.value = 1
rowSlider.maximumValue = 10
rowSlider.minimumValue = 1
rowSlider.minimumTrackTintColor = .white
sliderNumber.text = "\(Int(rowSlider.value))"

// 為滑動條和分段控制器添加動作目標,以響應用戶的操作。
rowSlider.addTarget(self, action: #selector(sliderValueChange(_: )), for: .valueChanged)
segmentdevice1.addTarget(self, action: #selector(indexChange(_: )), for: .valueChanged)
}
// MARK: - function

// 當滑動條的值變化時被調用的方法。
@objc func sliderValueChange (_ sender: UISlider) {
// 將滑動條的值轉換為整數,因為我們需要一個整數來決定蘋果的數量。
let sliderValue = Int(sender.value)

// 更新顯示滑動條數值的標籤。
sliderNumber.text = "\(sliderValue)"

// 清空蘋果列表標籤的現有文本。
appleList.text = ""

// 根據目前選擇的圖形排列(由分段控制器的索引`index`決定)來更新蘋果列表。
if index == 0 {
// 直線排列。
for r in 1...sliderValue {
if r < sliderValue {
// 除最後一行外,所有行使用綠蘋果🍏。
for _ in 1...sliderValue {
appleList.text! += "🍏"
}
} else {
// 最後一行使用紅蘋果🍎。
for _ in 1...sliderValue {
appleList.text! += "🍎"
}
}
appleList.text! += "\n" // 每行後添加換行符,以形成多行排列。
}

} else if index == 1 {
// 斜線排列。
for r in 1...sliderValue {
for c in 1...sliderValue{
if r == c {
// 對角線位置使用紅蘋果🍎。
appleList.text! += "🍎"
} else {
// 其他位置使用綠蘋果🍏。
appleList.text! += "🍏"
}
}
appleList.text! += "\n" // 添加換行符。
}

} else if index == 2 {
// 梅花排列。
for r in 1...sliderValue {
for c in 1...sliderValue{
if (r + c) % 2 == 0 {
// 偶數位置使用紅蘋果🍎。
appleList.text! += "🍎"
} else {
// 奇數位置使用綠蘋果🍏。
appleList.text! += "🍏"
}
}
appleList.text! += "\n" // 添加換行符。
}

} else if index == 3 {
// 正方形排列。
for _ in 1...sliderValue {
for _ in 1...sliderValue {
// 所有位置都使用紅蘋果🍎。
appleList.text! += "🍎"
}
appleList.text! += "\n" // 添加換行符。
}

} else if index == 4 {
// 三角形排列。
for r in 1...sliderValue {
for c in 1...sliderValue {
if c <= r {
// 在三角形範圍內使用紅蘋果🍎。
appleList.text! += "🍎"
}
}
appleList.text! += "\n" // 添加換行符。
}

} else if index == 5 {
// 金字塔排列。
for r in 1...sliderValue {
let s = sliderValue + r - 1
for c in 1...s {
if c + r <= sliderValue {
// 金字塔的上半部分使用紅蘋果🍎。
appleList.text! += "🍎"
} else {
// 金字塔的下半部分使用綠蘋果🍏。
appleList.text! += "🍏"
}
}
appleList.text! += "\n" // 添加換行符。
}

} else {
// 菱形排列。
let v = sliderValue * 2 - 1
for r in 1...v {
if r <= sliderValue {
let s = sliderValue + r - 1
for c in 1...s {
if c + r <= sliderValue {
// 菱形的上半部分使用紅蘋果🍎。
appleList.text! += "🍎"
} else {
// 菱形的下半部分使用綠蘋果🍏。
appleList.text! += "🍏"
}
}
} else if r > sliderValue {
let s = v - r + sliderValue
for c in 1...s {
if r - c >= sliderValue {
// 菱形的下半部分使用紅蘋果🍎。
appleList.text! += "🍎"
} else {
// 菱形的上半部分使用綠蘋果🍏。
appleList.text! += "🍏"
}
}
}
appleList.text! += "\n" // 添加換行符。
}
}
}


// 當分段控制器的選項變化時調用此函數。
@objc func indexChange (_ sender: UISegmentedControl) {
// ... 更新分段控制器的索引,並重設蘋果列表。
index = sender.selectedSegmentIndex
sliderNumber.text = "\(0)"
rowSlider.value = 0
appleList.text = ""

}




}

程式碼

// 兩種陣列


import UIKit

// 定義arrayLoopViewController類,繼承自UIViewController。
class arrayLoopViewController: UIViewController {

// 定義滑動條、標籤、分段控制器和陣列列表標籤。
var rowSlider: UISlider!
var sliderNumber: UILabel!
var segmentdevice1: UISegmentedControl!
var arraylist: UILabel!

// 用於追踪分段控制器選項的索引。
var index = 0

// 當視圖控制器的視圖加載完畢後調用此方法。
override func viewDidLoad() {
super.viewDidLoad()

// 初始化和設置滑動條。
rowSlider = UISlider()
rowSlider.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(rowSlider)

// 初始化和設置顯示滑動條數值的標籤。
sliderNumber = UILabel()
sliderNumber.translatesAutoresizingMaskIntoConstraints = false
sliderNumber.textColor = .white
view.addSubview(sliderNumber)

// 初始化和設置分段控制器,添加選項。
segmentdevice1 = UISegmentedControl()
segmentdevice1.insertSegment(withTitle: "陣列一", at: 0, animated: true)
segmentdevice1.insertSegment(withTitle: "陣列二", at: 1, animated: true)
segmentdevice1.selectedSegmentIndex = 0
segmentdevice1.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(segmentdevice1)

// 初始化和設置陣列列表標籤。
arraylist = UILabel()
arraylist.translatesAutoresizingMaskIntoConstraints = false
arraylist.numberOfLines = 0
view.addSubview(arraylist)


// 設置各界面元素的約束條件。
NSLayoutConstraint.activate([
// 滑動條、陣列列表、標籤和分段控制器的約束
rowSlider.centerXAnchor.constraint(equalTo: view.centerXAnchor),
rowSlider.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -200),
rowSlider.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.75),

arraylist.centerXAnchor.constraint(equalTo: view.centerXAnchor),
arraylist.centerYAnchor.constraint(equalTo: view.centerYAnchor),

sliderNumber.centerXAnchor.constraint(equalTo: view.centerXAnchor),
sliderNumber.bottomAnchor.constraint(equalTo: rowSlider.bottomAnchor, constant: 100),

segmentdevice1.centerXAnchor.constraint(equalTo: view.centerXAnchor),
segmentdevice1.topAnchor.constraint(equalTo: view.topAnchor, constant: 80),
segmentdevice1.widthAnchor.constraint(equalTo: view.widthAnchor)


])

// 設置滑動條的初始值、最大值、最小值。
rowSlider.value = 1
rowSlider.maximumValue = 10
rowSlider.minimumValue = 1
rowSlider.minimumTrackTintColor = .white
sliderNumber.text = "\(Int(rowSlider.value))"

// 為滑動條和分段控制器添加動作目標。
rowSlider.addTarget(self, action: #selector(sliderValueChange(_: )), for: .valueChanged)
segmentdevice1.addTarget(self, action: #selector(indexChange(_: )), for: .valueChanged)
}

// 當分段控制器選項變更時調用的方法。
@objc func indexChange (_ sender: UISegmentedControl) {
// 更新選項索引,重置滑動條和標籤。
index = sender.selectedSegmentIndex
sliderNumber.text = "\(0)"
rowSlider.value = 0
}

// 當滑動條值變更時調用的方法。
@objc func sliderValueChange(_ sender: UISlider) {
// 清空陣列列表標籤的現有內容。
arraylist.text = ""

// 根據分段控制器的選項選擇不同的陣列進行操作。
if index == 0 {
// 選擇第一組陣列。
let arraystorage = ["🐶","🐱","🐼","🐹","🐰"]
sender.maximumValue = Float(arraystorage.count)
let sliderValue = Int(sender.value)
sliderNumber.text = "\(sliderValue)"

for r in 0...sliderValue - 1 {
let role = arraystorage[r]
for _ in 0...r {
arraylist.text! += role
}
arraylist.text! += "\n"
}
} else {
// 選擇第二組陣列。
let arraystorage = ["🍔", "🌭", "🌮", "🍣", "🥧"]
sender.maximumValue = Float(arraystorage.count)
let sliderValue = Int(sender.value)
sliderNumber.text = "\(sliderValue)"

for r in 0...sliderValue - 1 {
let food = arraystorage[r]
for _ in 1...sliderValue {
arraylist.text! += food
}
arraylist.text! += "\n"
}
}
}
}

我自己在全部做完之後有再去看彼得寫的程式碼,也才發現原來還有一個陣列的菱形😂,彼得這段程式碼看了好久問了無數次 AI 才終於理解 🥲

圖片 & 程式碼取自

var content = ""
let count = 5
let animals = ["🐈", "🦮", "🐇", "🐒", "🐄"]
var appleCount = count - 1
var animalCount = 1
for i in 1...count*2-1 {
for _ in 0..<appleCount {
content += "🍎"
}
let number = (animalCount-1) / 2
for j in 0...number {
content += animals[j]
}
for j in 0..<number {
content += animals[number-1-j]
}
if i < count {
appleCount -= 1
animalCount += 2
} else {
appleCount += 1
animalCount -= 2
}
content += "\n"
}

GPT 解釋

代碼解釋:

let number = (animalCount-1) / 2

  • animalCount 變數控制每一行中動物表情符號的總數。因為我們想要一個對稱的模式,所以這裡計算 number 作為對稱序列中的一半(或近似一半)的長度。
  • 例如,如果 animalCount 是 5,則 (animalCount-1) / 2 的結果是 2。這意味著在對稱序列的每邊我們會放置 2 個動物表情符號。

for j in 0...number { content += animals[j] }

  • 這個迴圈生成序列的左半部分。從 animals 陣列的開頭開始,根據 number 的值逐一添加表情符號到 content
  • 在上面的例子中,這會添加 “🐈🦮”。

for j in 0..<number { content += animals[number-1-j] }

  • 這個迴圈生成序列的右半部分,並且以相反的順序進行。
  • 它從 number-1 開始,向下遞減,這確保了右側的模式是左側的鏡像。
  • 在上面的例子中,這會添加 “🦮🐈”,使整個序列成為 “🐈🦮🦮🐈”。

在這段代碼中,animalCount - 1 是為了正確計算出在每一行中應該顯示的動物表情符號的數量,以創建一個對稱的圖案。讓我來詳細解釋這一點。

想象一下,你有一個對稱圖案,其中每一行的動物表情符號數量逐漸增加,然後又逐漸減少。在每一行中,動物表情符號的分佈是對稱的。例如,如果一行中有 5 個動物表情符號,則分佈可能是這樣的:🐈🦮🐇🦮🐈。你會發現中間的動物表情符號(🐇)只出現一次,而兩邊的則各自出現了兩次。

在這個特定的代碼實現中:

  • animalCount 代表每一行中動物表情符號的總數。
  • 由於對稱圖案的中心點(如上例中的 🐇)在每一行中只出現一次,我們需要從 animalCount 中減去 1,然後將其除以 2,以找到除中心點外每側應有的動物表情符號數量。

因此,計算 number = (animalCount - 1) / 2 是為了獲得除了中心點外,每側的動物表情符號數量。這樣,我們可以確保圖案的對稱性,並且在每一行中正確地放置動物表情符號。

總結來說,animalCount - 1 的計算是為了適應對稱圖案的需求,確保除中心點外的左右兩側都有相等數量的動物表情符號。

在這個迴圈 for j in 0..<number { content += animals[number-1-j] } 中,使用 <number 是為了正確地構建對稱圖案的一部分。讓我解釋一下這個迴圈的工作原理:

  • number 變數代表了每一行中動物表情符號(除了中心點)的數量。例如,如果 number 為 2,則代表每側(左或右)應有 2 個動物表情符號。
  • 迴圈 for j in 0..<number 會從 0 開始迭代到 number - 1。這是因為在 Swift 中,範圍運算子 ..< 創建了一個半開放範圍,包括起始值但不包括結束值。所以,如果 number 是 2,迴圈會迭代 0 和 1 這兩個索引。
  • 在迴圈內部,content += animals[number-1-j] 語句負責添加動物表情符號到 content 字符串中。這裡使用 number-1-j 是為了反向遍歷 animals 陣列的相應部分。例如,如果 number 是 2,則在第一次迭代時(j 為 0),number-1-j 是 1,所以會添加 animals[1],在第二次迭代時(j 為 1),number-1-j 是 0,所以會添加 animals[0]

總的來說,這個迴圈的目的是從 animals 陣列中反向添加動物表情符號到 content 中,從而創建對稱的圖案。使用 <number 確保了迴圈正確地遍歷了 animals 陣列的一部分,同時避免了超出陣列範圍的錯誤。

--

--