Swift 字面量轉換

2021-10-22 05:42:15 字數 4145 閱讀 4950

所謂字面量,就是指像特定數字字串布林值這樣,能夠直截了當的指出自己的型別並為變數進行賦值。我們看下面的例子:

let anumber =

3let astring =

"hello"

let abool =

true

其中的3hellotrue就稱為字面量

在swift中,array和dictionary在使用簡單的描述賦值的時候,使用的也是字面量,比如:

let anarray =[1

,2,3

]let adictionary =

["key1"

:"value1"

,"key2"

:"value2"

]

swift為我們提供了一組非常有意思的介面,用來將字面量轉換為特定的型別。對於那些實現了字面量轉換介面的型別,在提供字面量賦值的時候,就可以簡單地按照介面方法中定義的規則「無縫對應」的通過賦值的方式將值轉換為對應型別。這些介面包括了各個原生的字面量,在實際開發中我們經常用到的有:

所有的字面量轉換介面都定義了乙個typealias和對應的init方法。拿expressiblebybooleanliteral舉個例子:

public

protocol

expressiblebybooleanliteral

在這個介面中,booleanliteraltypeswift標準庫中已經有定義了:

/// the type aliased by `booleanliteraltype` must conform to the

/// `expressiblebybooleanliteral` protocol.

public

typealias

booleanliteraltype

=bool

於是在我們需要自己實現乙個字面量轉換的時候,可以簡單的只實現定義的init方法。舉個不太有實際意義的例子,假如我們想實現自己的bool型別,可以這麼做:

enum

mybool

:int

extension

mybool

:expressiblebybooleanliteral

}

這樣我們就能很容易的直接使用booltruefalse來對mybool型別進行賦值了:

let mytrue:

mybool

=true

let myfalse:

mybool

=false

print

(mytrue.rawvalue)

// 0

print

(myfalse.rawvalue)

// 1

expressiblebybooleanliteral大概是最簡單的形式,如果我們深入一點,就會發現像expressiblebystringliteral這樣的介面要複雜一些。這個介面不僅類似於上面布林值的情況,定義了stringliteraltype並接受其初始化方法,而且介面本身還需要實現下面兩個介面

還是用例子來說明,比如我們有個person類,裡面有這個人的名字:

class

person

}

如果通過string賦值來生成person物件的話,可以這樣改寫這個類:

class

person

:expressiblebystringliteral

required

init

(stringliteral value:

stringliteraltype

)required

init

(extendedgraphemeclusterliteral value:

string

)required

init

(unicodescalarliteral value:

string

)}

所有介面定義的init前面我們都加上了required關鍵字,這是由初始化方法完備性需求所決定的,這個類的子類都需要保證能夠做類似的字面量轉換,以確保型別安全

在上面的例子裡有很多重複的對self.name賦值的**,這不是我們樂於見到的。乙個改善方式是在這些初始化方法中呼叫原來的init(name value: string),在這種情況下,我們需要在這些初始化方法加上convenience

class

person

:expressiblebystringliteral

required

convenience

init

(stringliteral value:

stringliteraltype

)required

convenience

init

(extendedgraphemeclusterliteral value:

string

)required

convenience

init

(unicodescalarliteral value:

string

)}

let p:

person

="xiaoming"

print

(p.name)

// xiaoming

在上面person的例子中,我們沒有像在mybool中做的那樣,使用extension的方式來擴充套件類,使其可以用字面量賦值,這是因為在extension中,我們不能定義required的初始化方法的。也就是說,我們無法為現有的非final的class新增字面量轉換(不過也許在以後的swift版本中能有所改善)。

字面量轉換是乙個很強大的功能,使用得當的話對縮短**清晰表意都很有幫助。但它同時又是乙個比較隱蔽的特性,因為你的**並沒有顯示賦值或者初始化,所以可能會給人造成迷惑,比如上面例子中為什麼乙個字串能被賦值為person。你的同事在閱讀**的時候可能不得不去尋找這些負責字面量轉換的**進行檢視(如果**庫很大的話,這不是一件容易的事情,因為你沒有辦法對字面量賦值用「cmd + 單擊」進行轉換)。和其他的swift新鮮特性一樣,我們究竟該如何使用字面量轉換,它的最佳實踐到底是什麼,仍然都在研究及討論中。因此在使用這樣的新特性時,必須力求表意清晰沒有誤解,這樣**才能經受的住考驗

7 swift開發iOS 字面量

swift 字面量 所謂字面量,就是指像特定的數字,字串或者是布林值這樣,能夠直接了當地指出自己的型別並為變數進行賦值的值。比如在下面 let anumber 3 整型字面量 let astring hello 字串字面量 let abool true 布林值字面量 整型字面量 整型字面量可以是乙個...

字面量和整數字面量

字面量是指c c 源 中直接使用的常量,字面量的意思是 一眼看上去是什麼就是什麼 例如語句 int x 10 中10就是字面量,它相對於變數,只有乙個確定的值不能改變,這個值就是它看上去的值。c c 中的字面量有一下幾種 1.0和正整數,如10 123等 負整數不是字面量,因為加了 運算子 2.浮點...

Go字面量(字面常量)

目錄 字面量字面量型別 整型字面量 浮點型字面量 複數型別字面量 字元型字面量 字串字面量 程式語言源程式中表示固定值的符號叫做字面量,也稱字面常量。一般使用裸字串行來表示不同型別的值。字面量可以被程式語言編譯器直接轉換為某個型別的值。go的字面量可以出現在兩個地方 一是用於常量和變數的初始化,二是...