#13 字串,擴展語法,多組合文字的學習筆記

範例檔文件第24個提及字串的一些相關語法函式,在此做個筆記,並結合擴展語法的部分,一併進行整理.

不囉唆,直接上菜!

var name = "Taylor"

//一個字一個字取出來
for letter in name {
print(letter)
}
//字母 陣列搜尋化
print(name[name.index(name.startIndex, offsetBy: 3)])
//"l"

//字母 陣列搜尋化
// 擴展寫法
//輸入數字 顯示是第幾個
extension String {
subscript(i: Int) -> String {
return String(self[index(startIndex, offsetBy: i)])
}
}

let letter2 = name[5]
//"r"

處理字串刪減

let password = "12345"
//字母首 從開頭有這些連續字的話 回傳true
password.hasPrefix("234")
// print false


//字母尾 從字尾有這些連續字的話 回傳true
password.hasSuffix("345")
// print true


extension String {
//字母首 有這些字的話 刪除
func deletingPrefix(_ prefix: String) -> String {
guard self.hasPrefix(prefix) else { return self }
return String(self.dropFirst(prefix.count))
}
//字母尾 有這些字的話 刪除
func deletingSuffix(_ suffix: String) -> String {
guard self.hasSuffix(suffix) else { return self }
return String(self.dropLast(suffix.count))
}
}

// 把字尾連續的345的字串刪掉
password.deletingSuffix("345")
// print "12"

處理句子的第一個字母

let weather = "it's going to rain."
//字串第一個都大寫
print(weather.capitalized)
// print "It's Going To Rain."

//字串的第一個字大寫
extension String {
var capitalizedFirst: String {
//找到第一個字
guard let firstLetter = self.first else { return "" }
return firstLetter.uppercased() + self.dropFirst()
}
}

weather.capitalizedFirst
//"It's going to rain."

比對字串

let input = "Swift is like Objective-C without the C"
input.contains("Swift")

let languages = ["Python", "C++", "Swift", "Java", "VB.NET"]
languages.contains("Swift")

// 陣列跟 字串進行 比對
extension String {
func containsAny(of array: [String]) -> Bool {
for item in array {
if self.contains(item) {
return true
}
}
return false
}
}

//輸入陣列的字串 是否在字串中有
input.containsAny(of: languages)

//陣列當中是否有 字串
languages.contains(where: input.contains)

舊版組合文字

//舊版
let string2 = "This is a test string"


//舊版
let attributes: [NSAttributedString.Key: Any] = [
.foregroundColor: UIColor.white,
.backgroundColor: UIColor.red,
.font: UIFont.boldSystemFont(ofSize: 36)
]

// 文字跟 屬性分別設置
let attributedString = NSAttributedString(string: string2, attributes: attributes)

新版組合文字

        //組合多種樣式組合的文字 新版寫法
var label2 = UILabel()
//還要再設定位置

var content = AttributedString()

//分別創造文字,像是網頁標籤一樣分別加上屬性,一口氣設置
var name1 = AttributedString("anwei20 ")
name1.font = .boldSystemFont(ofSize: 30)
name1.foregroundColor = .black
content += name1

var message = AttributedString("戴佩妮創作的天花版的星星\n")
message.font = .systemFont(ofSize: 18)
message.foregroundColor = .gray
content += message

var lyrics = AttributedString("看你從没看過的風景 躲没躲過的大雨 創造一個天晴 避開你最討厭的擁擠 你最害怕的猜疑 好好喘口氣")
lyrics.font = .systemFont(ofSize: 14)
lyrics.foregroundColor = .systemPink
lyrics.backgroundColor = .cyan

//間距
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = 5
lyrics.paragraphStyle = paragraphStyle
content += lyrics

label2.attributedText = NSAttributedString(content)

相關語法


let string5 = "pet"


//如果輸入的字 前面開始的字串中沒有的話
extension String {
func withPrefix(_ prefix: String) -> String {
if self.hasPrefix(prefix) { return self }
return prefix + self
}
}

string5.withPrefix("Cat")
//print "Catpet"


let string6 = "Hello123World"

//如果含有數字的話
extension String {
var isNumeric: Bool {
for character in self {
let character = String(character)
if Int(character) != nil {
return true
}
}
return false
}
}

string6.isNumeric
// print true


let string8 = "Hello\nWorld\nThis\nIs\nA\nString"

//字串 用變數轉成 陣列
extension String {
var lines: [String] {
var arr = [String]()
arr = self.components(separatedBy: "\n")
return arr
}
}

print(string8.lines)
// ["Hello", "World", "This", "Is", "A", "String"]

擴展(extension)

  • 新增計算屬性(包含實體屬性和型別屬性)。
  • 定義實體方法和型別方法(不能覆寫已存在的方法)。
  • 提供新的建構器。
  • 定義下標。
  • 定義和使用新的巢狀型別。
  • 讓一個已存在的型別遵循某個協定

新增計算屬性(包含實體屬性和型別屬性)

extension Double {
var km: Double { return self * 1_000.0 }
var m: Double { return self }
var cm: Double { return self / 100.0 }
}

// 直接對型別 Double 的值取得屬性
let aMarathon = 42.km + 195.m

// 印出:馬拉松的距離全長為 42195.0 公尺
print("馬拉松的距離全長為 \(aMarathon) 公尺")

定義實體方法和型別方法(不能覆寫已存在的方法)

// 新增一個實體方法 有一個參數 型別為 () -> Void 的閉包
// 這個新增的實體方法會執行這個閉包
// 執行次數為:這個整數本身代表數字
extension Int {
func repetitions(task: () -> Void) {
for _ in 0..<self {
task()
}
}
}

// 會依序印出 3 次:Hello!
// 這邊使用 尾隨閉包 簡化語法
3.repetitions {
print("Hello!")
}



// 為內建的 Int 型別新增一個變異實體方法:取得這個整數的平方數
extension Int {
mutating func square() {
self = self * self
}
}

// 先宣告一個整數
var oneInt = 5

// 接著呼叫方法 這裡會得到 25
oneInt.square()

提供新的建構器

// 定義一個結構 會有一個自動生成的成員逐一建構器
struct GameCharacter {
var hp = 100,mp = 100, name = ""
}

// 為結構 GameCharacter 定義一個建構器的擴展
extension GameCharacter {
init(name:String) {
self.name = name
print("新名字為 \(name)")
}
}

// 使用擴展後定義的建構器
let oneChar = GameCharacter(name: "弓箭手")

// 原本的成員逐一建構器仍然可以使用
let twoChar = GameCharacter(hp: 200, mp: 50, name: "戰士")

定義下標

// 定義下標 取得一個整數從個位數算起第幾個數字
// 索引值:0 為取得個位數, 1 為取得十位數, 2為取得百位數 依此類推
extension Int {
subscript(digitIndex: Int) -> Int {
var decimalBase = 1
for _ in 0..<digitIndex {
decimalBase *= 10
}
return (self / decimalBase) % 10
}
}

// 接著就可以得到每一個位數的數字
// 得到個位數:9
123456789[0]

// 得到千位數:6
123456789[3]

定義和使用新的巢狀型別

// 為內建的 Int 型別內新增一個列舉的擴展
// 用來表示這個整數是負數、零還是正數
extension Int {
enum Kind {
case Negative, Zero, Positive
}

// 另外還新增一個計算屬性 用來返回列舉情況
var kind: Kind {
switch self {
case 0:
return .Zero
case let x where x > 0:
return .Positive
default:
return .Negative
}
}
}

// 依序會印出:Positive、Negative、Zero
for number in [3, -12, 0] {
print(number.kind)
}

參考資料:

https://itisjoe.gitbooks.io/swiftgo/content/ch2/extensions.html

--

--