學習軌道
/
Swift
Swift
/
練習
/
Cal 的訂製招牌店
Cal 的訂製招牌店

Cal 的訂製招牌店

學習練習

簡介

字串代表文字資料。 在 Swift 中,String是一組有序的Character值集合,其中每個字元都代表一個 Unicode 字元。

你使用字串字面值來建立字串,也就是一串以雙引號(")包圍的字元。 如果要建立多行字串,請使用三個雙引號("""):

let hello: String = "Hello, World!"

let poem: String = """
Roses are red,
Violets are blue.
Sugar is sweet,
And so are you.
"""

Swift 字串能與 Foundation 框架的NSString類別無縫接軌,讓你使用豐富的文字處理功能。

字元

Character代表單一的延伸字素叢集,也就是由一個或多個 Unicode 純量值組成人類可讀的字元。 Unicode 純量值是一個 21 位元的碼點,範圍從U+0000到U+D7FF(含),或從U+E000到U+10FFFF(含)。

let aChar: Character = "A"

型別推論

當你寫下字串字面值時,Swift 會自動將它的型別推論為String。 若要把單一字元儲存成Character,你必須明確標註型別:

let aString = "A"        // Inferred as String
let aChar: Character = "A" // Explicitly typed as Character
print(type(of: aString)) // Prints String
print(type(of: aChar))   // Prints Character

// The following code will not compile:
let badChar: Character = "Too many characters"
// Error: Cannot convert value of type 'String' to specified type 'Character'

串接

你可以使用加號運算子(+)把字串連接起來:

print("honey" + "comb")
// Prints "honeycomb"

你無法直接用+把Character串接到String上,必須先將該字元轉換成字串才行。 不過,你可以使用append(_:)方法,把字串或字元直接附加到可變字串上:

var greeting = "Hello"
let world = ", world"
let period: Character = "."

greeting.append(world)
print(greeting) // Prints "Hello, world"

greeting.append(period)
print(greeting) // Prints "Hello, world."

字串內插

字串內插讓你能在字串字面值中嵌入常數、變數、字面值和運算式,藉此建構字串。 把每個運算式用小括號包起來,並在前面加上反斜線(\( ... )):

let radius = 5.0
let circle = "The area of a circle with radius \(radius) is \(Double.pi * radius * radius)"
print(circle) // Prints "The area of a circle with radius 5.0 is 78.53981633974483"

字串與字元的屬性

字串和字元提供幾個屬性,讓你檢視它們的內容。

字串屬性

常見的字串屬性包括:

屬性 說明 範例
isEmpty 若字串沒有任何字元,回傳true "Hello".isEmpty的結果是false
count 回傳字串中的字元數 "Hello".count的結果是5

完整的屬性清單請參閱 Apple 的 String 文件。

字元屬性

常見的字元屬性包括:

屬性 說明 範例
isLowercase 若字元是小寫,回傳true "a".isLowercase的結果是true
isUppercase 若字元是大寫,回傳true "A".isUppercase的結果是true
isNumber 若字元是數字,回傳true "1".isNumber的結果是true
isWhitespace 若字元是空白字元,回傳true " ".isWhitespace的結果是true

完整的屬性清單請參閱 Apple 的 Character 文件。

型別轉換

你可以使用String(_:)初始化器把其他型別轉換成字串,它支援Int、Double和Character等標準型別:

let charX: Character = "x"
print(String(charX))     // Prints "x"
print(String(110))       // Prints "110"
print(String(Double.pi)) // Prints "3.141592653589793"

特殊字元

Swift 字串字面值支援幾種特殊字元的跳脫序列:

序列 說明
\0 空字元
\\ 反斜線
\t 水平定位字元
\n 換行字元
\r 歸位字元
\' 單引號
\" 雙引號
\u{n} 任意 Unicode 純量值(十六進位)
let quote: String = "\"Hello\", he said."
print(quote) // Prints "Hello", he said.

let unicode: Character = "\u{1F496}"
print(unicode) // Prints 💖

說明

在這個練習中,你會撰寫程式碼,協助一家招牌公司為他們的招牌製作自訂訊息。

1. 建立一組實用的字串

定義以下常數字串,這些字串會用來製作招牌:

  • birthday:這個常數存放 "Birthday" 這個值
  • valentine:這個常數存放 "Valentine's Day" 這個值
  • anniversary:這個常數存放 "Anniversary" 這個字串

2. 建立一組實用的字元

定義以下常數字元,這些字元會用來製作招牌:

  • space:這個常數存放 " " 這個值(一個空格)
  • exclamation:這個常數存放 "!" 這個值

3. 組合詞句來建立訊息

實作函式 buildSign(for:name:),它接受引數 for,這個引數存放你在第一個任務中定義的三個字串之一,以及引數 name,這是一個存放招牌對象姓名的字串。 你要使用串接來建立招牌的訊息,並記得重複使用已經定義好的常數。 這個函式應該以字串回傳招牌訊息。

buildSign(for: birthday, name: "Otto")
// returns "Happy Birthday Otto!"

buildSign(for: anniversary, name: "Valentina")
// returns "Happy Anniversary Valentina!"

4. 建立畢業招牌

實作函式 graduationFor(name:year:),它接受引數 name,這是一個存放招牌對象姓名的字串,以及引數 year,這是一個存放對方畢業年份的整數。 你要使用模板字串來建立招牌的訊息。 這個函式應該以字串回傳招牌訊息。

graduationFor(name: "Padma", year: 2023)
// returns "Congratulations Padma!\nClass of 2023"

5. 計算招牌的費用

實作函式 costOf(sign:),它接受引數 sign,這是一個存放招牌訊息的字串。 招牌的基本價格是 20(以指定貨幣計)。此外,每個字母要花費 2(空白也計入計算)。 這個函式應該以整數回傳招牌的費用。

costOf(sign: "Happy Birthday Grandma!")
// returns 66
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Swift Exercism

準備好開始 Cal 的訂製招牌店 了嗎?

註冊 Exercism,透過 35 個概念116 個練習 和真人引導來學習並精通 Swift,全部免費。