Sin Lin
19 min readMar 13, 2023

迴圈練習|利用迴圈實現不同的排列方式

這次練習迴圈的10道題目,做的過程中需要先找出Emoji的關聯性

開始之前要注意幾個地方:
▪️由於我們要產生多行的Label,記得Lines要設定為0。
▪️因為後面要設定交集處有變化,所以Slider最大值要設為奇數。
▪️為了方便修改,將每道題目設定為Function,再於SegmentedContro呼叫。

📍IBAction與IBOutlet
SegmentedControl👉切換不同的排列
Slider👉Value等於迴圈次數
NumberLabel👉顯示Value
EmojiLabel👉顯示迴圈結果

先設定Slider的Value與numberLabel關係。

//設定Slider與Label的關係
sender.value = sender.value.rounded()
let number = Int(sender.value)
//因為value型別為Float,要轉換型別,將slider數值設為整數
numberLabel.text = "\(number)"
//轉換型別,將number轉為字串

設定切換SegmentedControl時,全部數值歸0。

    @IBAction func SegmentedControl(_ sender: Any) {
//切換SegmentedControl時,全部數值歸0
sliderOutlet.value = 0
emojiLabel.text = "📙"
numberLabel.text = "0"
}

1.畫長方形:

裡面的迴圈B向右印出橫向的列,外面的迴圈A則是向下印出直向的行(在每一次B列印完後,列印「下一行」,再重複迴圈B,因此產生行)。
由於兩個迴圈的次數都是slider的number來決定,因此行跟列的數量會一樣,因此產生矩形。

        //長方形排列(課程示範)
func rectangle() {
var content = ""
for _ in 1...number {
for _ in 1...number {
content += "📙"
}
content += "\n"
}
emojiLabel.text = content
numberLabel.text = "\(number)"
}

2.第一排最特別:

先找出關連,藍色書本📘的關聯👉都是第一列
如上題所說,由於外面的迴圈控制著列印「下一行」,因此條件要設在外面的迴圈上。

使用迴圈的其中一種寫法:for + 常數 + in + 範圍
迴圈執行的次數(也就是範圍),會存入前面的常數內,就可以利用if else去規定:當迴圈執行第幾次時,要列印📘。

        //第一排不一樣
func line() {
var content = ""
for i in 1...number {
for _ in 1...number {
if i == 1 {
content += "📘"
} else {
content += "📙"
}
}
content += "\n"
//記得大迴圈每跑一次就要換行一次
}
emojiLabel.text = content
numberLabel.text = "\(number)"

//膝反射寫法😀失敗..
/*for _ in 1...number {
content += "📘"
}
content += "\n"
for _ in 1...number {
for _ in 1...number {
content += "📙"
}
content += "\n"
}*/
}

3.畫對角線 \:

先找出關連,越來愈複雜,要用座標的概念來找~
藍色書本📘的關聯👉 i = j

        //對角線\
func diagonalRight() {
var content = ""
for i in 1...number {
for j in 1...number {
if i == j {
content += "📘"
} else {
content += "📙"
}
}
content += "\n"
//記得大迴圈每跑一次就要換行一次
}
emojiLabel.text = content
numberLabel.text = "\(number)"
}

4.畫對角線 /:

藍色書本📘的關聯👉 i + j = 10

        //對角線/
func diagonalLeft() {
var content = ""
for i in 1...number {
for j in 1...number {
if i + j == number + 1{
content += "📘"
} else {
content += "📙"
}
}
content += "\n"
//記得大迴圈每跑一次就要換行一次
}
emojiLabel.text = content
numberLabel.text = "\(number)"
}

5.畫 X,number只能是奇數:

藍色書本📘的關聯👉 i = j
藍色書本📘的關聯👉 i + j = 10
因為兩個條件符合其一即可,所以使用👉 ||(或),將這兩個關聯一起寫進去。

由於偶數是無法連成對角線的,所以要另外設定只有number為奇數時,才會出現📘。要篩選偶數或奇數,可以利用餘數,只要%2為0時,一定就是偶數;若為1則是奇數。

        //畫X,結果只能是奇數
func xLine() {
var content = ""
for i in 1...number{
for j in 1...number{
if (i == j || i + j == number + 1), number % 2 != 0 {
content += "📘"
}else {
content += "📙"
}
}
content += "\n"
//記得大迴圈每跑一次就要換行一次
}
emojiLabel.text = content
numberLabel.text = "\(number)"
}

6.畫十字,number只能是奇數:

藍色書本📘的關聯👉行與列的一半,且行與列必須為奇數。
因為是十字,所以📘會出現在行跟列一半(number / 2) + 1的位置。

        //畫+,結果只能是奇數
func cross() {
var content = ""
let count = (number / 2) + 1
for i in 1...number {
for j in 1...number {
if i == count || j == count, number % 2 != 0 {
content += "📘"
}else {
content += "📙"
}
}
content += "\n"
//記得大迴圈每跑一次就要換行一次
}
emojiLabel.text = content
numberLabel.text = "\(number)"
}

7.畫 X,number 只能是奇數,交叉的地方顯示🤍:

同題目5:
藍色書本📘的關聯👉 i = j
藍色書本📘的關聯👉 i + j = 10
因為兩個條件符合其一即可,所以使用👉 ||(或),將這兩個關聯一起寫進去。

新增條件:
白愛心🤍的關聯👉 i = ji + j = 10必須同時符合。

        func crossSpecial() {
var content = ""
let count = (number / 2) + 1
for i in 1...number {
for j in 1...number {
if i == j, i + j == number + 1, number % 2 != 0 {
//i == j, i + j == number + 1, number % 2 != 0 三個條件要同時成立
content += "🤍"
}else if i == j || i + j == number + 1, number % 2 != 0{
//i == j || i + j == number + 1 兩個條件其中之一成立,再加上奇數條件成立
content += "📘"
}else{
content += "📙"
}
}
content += "\n"
//記得大迴圈每跑一次就要換行一次
}
emojiLabel.text = content
numberLabel.text = "\(number)"
}

8.畫框框:

因為是由1開始往外長到number:

藍色書本📘的關聯👉 i = 1。
藍色書本📘的關聯👉 j= 1。
藍色書本📘的關聯👉 i = number。
藍色書本📘的關聯👉 j= number。

        //畫外框
func box(){
var content = ""
for i in 1...number{
for j in 1...number{
if i == 1 || j == 1 || i == number || j == number {
content += "📘"
}else {
content += "📙"
}
}
content += "\n"
//記得大迴圈每跑一次就要換行一次
}
emojiLabel.text = content
numberLabel.text = "\(number)"
}

9.梅花座:

藍色書本📘的關聯👉i + j = 偶數

        //梅花座
func checkerboard(){
var content = ""
for i in 1...number{
for j in 1...number{
if (i + j) % 2 == 0 {
content += "📘"
}else {
content += "📙"
}
}
content += "\n"
//記得大迴圈每跑一次就要換行一次
}
emojiLabel.text = content
numberLabel.text = "\(number)"
}

10.每排顯示不同圖案:

使用array依序呼叫Emoji

        func emojiRoles(){
let roles = ["❤️", "🧡", "💛", "💚", "💙", "💜", "🖤", "🤍", "🤎"]
var content = ""
for role in roles{
//因為是外面的迴圈決定每一列要出現的愛心顏色,所以將array設定在外面的迴圈,role會依序存入array內的愛心
for _ in 1...number{
//存入role目前呼叫到的愛心,並重複slider指定的次數
content += role
}
content += "\n"
//記得大迴圈每跑一次就要換行一次
}
emojiLabel.text = content
numberLabel.text = "\(number)"
}

參考:

完整程式碼:

import UIKit

class ViewController: UIViewController {

@IBOutlet weak var sliderOutlet: UISlider!
@IBOutlet weak var patternSegmentedControl: UISegmentedControl!
@IBOutlet weak var numberLabel: UILabel!
@IBOutlet weak var emojiLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.

}

@IBAction func SegmentedControl(_ sender: Any) {
//切換SegmentedControl時,全部數值歸0
sliderOutlet.value = 0
emojiLabel.text = "📙"
numberLabel.text = "0"
}
@IBAction func slider(_ sender: UISlider) {

//設定Slider與Label的關係
sender.value = sender.value.rounded()
let number = Int(sender.value)
//因為value型別為Float,要轉換型別,將slider數值設為整數
numberLabel.text = "\(number)"
//轉換型別,將number轉為字串

//先建立不同的function,在設定SegmentedControl可以直接在大括號內呼叫func
//長方形排列(課程示範)
func rectangle() {
var content = ""
for _ in 1...number {
for _ in 1...number {
content += "📙"
}
content += "\n"
}
emojiLabel.text = content
numberLabel.text = "\(number)"
}
//第一排不一樣
func line() {
var content = ""
for i in 1...number {
for _ in 1...number {
if i == 1 {
content += "📘"
} else {
content += "📙"
}
}
content += "\n"
//記得大迴圈每跑一次就要換行一次
}
emojiLabel.text = content
numberLabel.text = "\(number)"
//膝反射寫法😀失敗..
/*for _ in 1...number {
content += "📘"
}
content += "\n"
for _ in 1...number {
for _ in 1...number {
content += "📙"
}
content += "\n"
}*/
}
//對角線\
func diagonalRight() {
var content = ""
for i in 1...number {
for j in 1...number {
if i == j {
content += "📘"
} else {
content += "📙"
}
}
content += "\n"
//記得大迴圈每跑一次就要換行一次
}
emojiLabel.text = content
numberLabel.text = "\(number)"
}
//對角線/
func diagonalLeft() {
var content = ""
for i in 1...number {
for j in 1...number {
if i + j == number + 1{
content += "📘"
} else {
content += "📙"
}
}
content += "\n"
//記得大迴圈每跑一次就要換行一次
}
emojiLabel.text = content
numberLabel.text = "\(number)"
}
//畫X,結果只能是奇數
func xLine() {
var content = ""
for i in 1...number{
for j in 1...number{
if (i == j || i + j == number + 1), number % 2 != 0 {
content += "📘"
}else {
content += "📙"
}
}
content += "\n"
//記得大迴圈每跑一次就要換行一次
}
emojiLabel.text = content
numberLabel.text = "\(number)"
}
//畫+,結果只能是奇數
func cross() {
var content = ""
let count = (number + 1) / 2
for i in 1...number {
for j in 1...number {
if i == count || j == count, number % 2 != 0{
content += "📘"
}else {
content += "📙"
}
}
content += "\n"
//記得大迴圈每跑一次就要換行一次
}
emojiLabel.text = content
numberLabel.text = "\(number)"
}

//畫X,結果只能是奇數,中心點的Emoji用📗
func crossSpecial() {
var content = ""
let count = (number / 2) + 1
for i in 1...number {
for j in 1...number {
if i == j, i + j == number + 1, number % 2 != 0 {
//i == j, i + j == number + 1, number % 2 != 0 三個條件要同時成立
content += "🤍"
}else if i == j || i + j == number + 1, number % 2 != 0{
//i == j || i + j == number + 1 兩個條件其中之一成立,再加上奇數條件成立
content += "📘"
}else{
content += "📙"
}
}
content += "\n"
//記得大迴圈每跑一次就要換行一次
}
emojiLabel.text = content
numberLabel.text = "\(number)"
}
//畫外框
func box(){
var content = ""
for i in 1...number{
for j in 1...number{
if i == 1 || j == 1 || i == number || j == number {
content += "📘"
}else {
content += "📙"
}
}
content += "\n"
//記得大迴圈每跑一次就要換行一次
}
emojiLabel.text = content
numberLabel.text = "\(number)"
}
//梅花座
func checkerboard(){
var content = ""
for i in 1...number{
for j in 1...number{
if (i + j) % 2 == 0 {
content += "📘"
}else {
content += "📙"
}
}
content += "\n"
//記得大迴圈每跑一次就要換行一次
}
emojiLabel.text = content
numberLabel.text = "\(number)"
}
//每排顯示不同圖案
func emojiRoles(){
let roles = ["❤️", "🧡", "💛", "💚", "💙", "💜", "🖤", "🤍", "🤎"]
var content = ""
for role in roles{
//因為是外面的迴圈決定每一列要出現的愛心顏色,所以將array設定在外面的迴圈,role會依序存入array內的愛心
for _ in 1...number{
//存入role目前呼叫到的愛心,並重複slider指定的次數
content += role
}
content += "\n"
//記得大迴圈每跑一次就要換行一次
}
emojiLabel.text = content
numberLabel.text = "\(number)"
}

//設定不同的SegmentedControl
if patternSegmentedControl.selectedSegmentIndex == 0 {
rectangle()
} else if patternSegmentedControl.selectedSegmentIndex == 1 {
line()
} else if patternSegmentedControl.selectedSegmentIndex == 2 {
diagonalRight()
} else if patternSegmentedControl.selectedSegmentIndex == 3 {
diagonalLeft()
} else if patternSegmentedControl.selectedSegmentIndex == 4 {
xLine()
} else if patternSegmentedControl.selectedSegmentIndex == 5 {
cross()
} else if patternSegmentedControl.selectedSegmentIndex == 6 {
crossSpecial()
} else if patternSegmentedControl.selectedSegmentIndex == 7 {
box()
} else if patternSegmentedControl.selectedSegmentIndex == 8 {
checkerboard()
} else if patternSegmentedControl.selectedSegmentIndex == 9 {
emojiRoles()
}
}
}