所謂字面量
,就是指像特定
的數字
、字串
和布林值
這樣,能夠直截了當的指出
自己的型別
並為變數進行賦值
的值
。我們看下面的例子:
let anumber =
3let astring =
"hello"
let abool =
true
其中的3
、hello
和true
就稱為字面量
在swift中,array和dictionary在使用簡單的描述賦值的時候,使用的也是字面量,比如:
let anarray =[1
,2,3
]let adictionary =
["key1"
:"value1"
,"key2"
:"value2"
]
swift為我們提供了一組非常有意思的介面,用來將字面量轉換為特定的型別。對於那些實現了字面量轉換介面的型別,在提供字面量賦值的時候,就可以簡單地按照介面方法中定義的規則「無縫對應」的通過賦值的方式將值轉換為對應型別。這些介面包括了各個原生的字面量,在實際開發中我們經常用到的有:
所有
的字面量轉換介面
都定義了乙個typealias
和對應的init方法
。拿expressiblebybooleanliteral
舉個例子:
public
protocol
expressiblebybooleanliteral
在這個介面中,booleanliteraltype
在swift
標準庫中已經有定義了:
/// the type aliased by `booleanliteraltype` must conform to the
/// `expressiblebybooleanliteral` protocol.
public
typealias
booleanliteraltype
=bool
於是在我們需要自己實現乙個字面量轉換
的時候,可以簡單的只實現定義的init方法
。舉個不太有實際意義的例子,假如我們想實現自己的bool型別
,可以這麼做:
enum
mybool
:int
extension
mybool
:expressiblebybooleanliteral
}
這樣我們就能很容易的直接使用bool
的true
和false
來對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的字面量可以出現在兩個地方 一是用於常量和變數的初始化,二是...