整數(shù)類型
有符號(hào)和無符號(hào)
有符號(hào)整數(shù)類型包括 Int8笋妥、Int16懊昨、Int32、Int64 和 IntNative春宣,分別用于表示編碼長(zhǎng)度為 8-bit酵颁、16-bit、32-bit月帝、64-bit 和平臺(tái)相關(guān)大小的有符號(hào)整數(shù)值的類型躏惋。
無符號(hào)整數(shù)類型包括 UInt8、UInt16嚷辅、UInt32簿姨、UInt64 和 UIntNative,分別用于表示編碼長(zhǎng)度為 8-bit簸搞、16-bit扁位、32-bit、64-bit 和平臺(tái)相關(guān)大小的無符號(hào)整數(shù)值的類型趁俊。
這個(gè)比其他語(yǔ)言定義豐富域仇,一般就給個(gè)int,就是相當(dāng)于這里的IntNative
字面量
整數(shù)類型字面量有 4 種進(jìn)制表示形式:二進(jìn)制(使用 0b 或 0B 前綴)寺擂、八進(jìn)制(使用 0o 或 0O 前綴)暇务、十進(jìn)制(沒有前綴)、十六進(jìn)制(使用 0x 或 0X 前綴)怔软。
在 Int64 類型適合的情況下垦细,首選 Int64 類型,因?yàn)?Int64 的表示范圍足夠大挡逼,并且整數(shù)類型字面量在沒有類型上下文的情況下默認(rèn)推斷為 Int64 類型蝠检,可以避免不必要的類型轉(zhuǎn)換。
-
在使用整數(shù)類型字面量時(shí)挚瘟,可以通過加入后綴來明確整數(shù)字面量的類型
后綴與類型的對(duì)應(yīng)
var x = 100i8 // x is 100 with type Int8
var y = 0x10u64 // y is 16 with type UInt64
var z = 0o432i32 // z is 282 with type Int32
- 倉(cāng)頡編程語(yǔ)言支持字符字節(jié)字面量叹谁,以方便使用 ASCII 碼表示 UInt8 類型的值饲梭。字符字節(jié)字面量由字符 b、一對(duì)標(biāo)識(shí)首尾的單引號(hào)焰檩、以及一個(gè) ASCII 字符組成憔涉。
var a = b'x' // a is 120 with type UInt8
var b = b'\n' // b is 10 with type UInt8
var c = b'\u{78}' // c is 120 with type UInt8
這個(gè)比較特殊,其他地方很少見析苫。有些場(chǎng)景下能帶來方便兜叨,比如字符x的ASCII 碼,就是b'x',這就是個(gè)整數(shù)衩侥,具體數(shù)值不用管国旷,只要知道是字符a的ASCII 碼,是個(gè)整數(shù)就可以了茫死。不然的話跪但,代碼中給120,誰(shuí)能想到這是字符x的ASCII 碼
冪運(yùn)算
** 的左操作數(shù)只能為 Int64 類型或 Float64 類型峦萎。
當(dāng)左操作數(shù)類型為 Int64 時(shí)屡久,右操作數(shù)只能為 UInt64 類型,表達(dá)式的類型為 Int64爱榔。
當(dāng)左操作數(shù)類型為 Float64 時(shí)被环,右操作數(shù)只能為 Int64 類型或 Float64 類型,表達(dá)式的類型為 Float64详幽。
let p1 = 2 ** 3 // p1 = 8
let p2 = 2 ** UInt64(3 ** 2) // p2 = 512
let p3 = 2.0 ** 3.0 // p3 = 8.0
let p4 = 2.0 ** 3 ** 2 // p4 = 512.0
let p5 = 2.0 ** 3.0 // p5 = 8.0
let p6 = 2.0 ** 3.0 ** 2.0 // p6 = 512.0
這個(gè)比較特殊筛欢,其他地方很少見。
浮點(diǎn)類型
浮點(diǎn)類型包括 Float16唇聘、 Float32 和 Float64版姑,分別用于表示編碼長(zhǎng)度為 16-bit、 32-bit 和 64-bit 的浮點(diǎn)數(shù)(帶小數(shù)部分的數(shù)字雳灾,如 3.14159漠酿、8.24 和 0.1 等)的類型冯凹。Float16谎亩、 Float32 和 Float64 分別對(duì)應(yīng) IEEE 754 中的半精度格式(即 binary16)、單精度格式(即 binary32)和雙精度格式(即 binary64)宇姚。
在使用十進(jìn)制浮點(diǎn)數(shù)字面量時(shí)匈庭,可以通過加入后綴來明確浮點(diǎn)數(shù)字面量的類型
let a = 3.14f32 // a is 3.14 with type Float32
let b = 2e3f32 // b is 2e3 with type Float32
let c = 2.4e-1f64 // c is 2.4e-1 with type Float64
let d = .123e2f64 // d is .123e2 with type Float64
布爾類型
- 布爾類型只有兩個(gè)字面量:true 和 false。
let a: Bool = true
let b: Bool = false
字符類型
字符類型使用 Rune 表示浑劳,可以表示 Unicode 字符集中的所有字符阱持。
一個(gè) Rune 字面量由字符 r 開頭,后跟一個(gè)由一對(duì)單引號(hào)或雙引號(hào)包含的字符魔熏。
let a: Rune = r'a'
let b: Rune = r"b"
- 轉(zhuǎn)義字符是指在一個(gè)字符序列中對(duì)后面的字符進(jìn)行另一種解釋的字符衷咽。轉(zhuǎn)義字符使用轉(zhuǎn)義符號(hào) \ 開頭鸽扁,后面加需要轉(zhuǎn)義的字符。
let slash: Rune = r'\\'
let newLine: Rune = r'\n'
let tab: Rune = r'\t'
- 通用字符以 \u 開頭镶骗,后面加上定義在一對(duì)花括號(hào)中的 1~8 個(gè)十六進(jìn)制數(shù)桶现,即可表示對(duì)應(yīng)的 Unicode 值代表的字符。
main() {
let he: Rune = r'\u{4f60}'
let llo: Rune = r'\u{597d}'
print(he)
print(llo)
}
你好
字符串類型
字符串類型使用 String 表示鼎姊,用于表達(dá)文本數(shù)據(jù)骡和,由一串 Unicode 字符組合而成。
單行字符串字面量的內(nèi)容定義在一對(duì)單引號(hào)或一對(duì)雙引號(hào)之內(nèi)相寇。
let s1: String = ""
let s2 = 'Hello Cangjie Lang'
let s3 = "\"Hello Cangjie Lang\""
let s4 = 'Hello Cangjie Lang\n'
- 多行字符串字面量開頭結(jié)尾需各存在三個(gè)雙引號(hào)(""")或三個(gè)單引號(hào)(''')慰于。
let s1: String = """
"""
let s2 = '''
Hello,
Cangjie Lang'''
- 多行原始字符串字面量以一個(gè)或多個(gè)井號(hào)(#)和一個(gè)單引號(hào)(')或雙引號(hào)(")開頭,后跟任意數(shù)量的合法字符唤衫,直到出現(xiàn)與字符串開頭相同的引號(hào)和與字符串開頭相同數(shù)量的井號(hào)為止婆赠。
let s1: String = #""#
let s2 = ##'\n'##
let s3 = ###"
Hello,
Cangjie
Lang"###
- 值表達(dá)式必須用花括號(hào) {} 包起來,并在 {} 之前加上 $ 前綴战授。
整體上页藻,字符串方面跟Swift差不多
元組類型
- 元組類型是不可變類型,即一旦定義了一個(gè)元組類型的實(shí)例植兰,它的內(nèi)容不能再被更新份帐。
var tuple = (true, false)
tuple[0] = false // Error, 'tuple element' can not be assigned
元組支持通過 t[index] 的方式訪問某個(gè)具體位置的元素
在賦值表達(dá)式中,可使用元組字面量對(duì)表達(dá)式的右值進(jìn)行解構(gòu)
var a: Int64
var b: String
var c: Unit
var f = { => ((1, "abc"), ())}
((a, b), c) = f() // value of a is 1, value of b is "abc", value of c is '()'
((a, b), _) = ((2, "def"), 3.0) // value of a is 2, value of b is "def", 3.0 is ignored
- 可以為元組類型標(biāo)記顯式的類型參數(shù)名
func getFruitPrice (): (name: String, price: Int64) {
return ("banana", 10)
}
- 對(duì)于一個(gè)元組類型楣导,只允許統(tǒng)一寫類型參數(shù)名废境,或者統(tǒng)一不寫類型參數(shù)名,不允許交替存在筒繁。
let c: (name: String, Int64) = ("banana", 5) // Error
數(shù)組類型
- 倉(cāng)頡使用 Array<T> 來表示 Array 類型噩凹。T 表示 Array 的元素類型,T 可以是任意類型毡咏。
var a: Array<Int64> = ... // Array whose element type is Int64
var b: Array<String> = ... // Array whose element type is String
- 元素類型不相同的 Array 是不相同的類型驮宴,所以它們之間不可以互相賦值。
b = a // Type mismatch
- 如果我們想獲取某一段 Array 的元素呕缭,可以在下標(biāo)中傳入 Range 類型的值堵泽,就可以一次性取得 Range 對(duì)應(yīng)范圍的一段 Array。
let arr1 = [0, 1, 2, 3, 4, 5, 6]
let arr2 = arr1[0..5] // arr2 contains the elements 0, 1, 2, 3, 4
- 當(dāng)省略 start 時(shí)恢总,Range 會(huì)從 0 開始迎罗;當(dāng)省略 end 時(shí),Range 的 end 會(huì)延續(xù)到最后一位片仿。
let arr1 = [0, 1, 2, 3, 4, 5, 6]
let arr2 = arr1[..3] // arr2 contains elements 0, 1, 2
let arr3 = arr1[2..] // arr3 contains elements 2, 3, 4, 5, 6
當(dāng)我們需要知道某個(gè) Array 包含的元素個(gè)數(shù)時(shí)纹安,可以使用 size 屬性獲得對(duì)應(yīng)信息。
Array 是引用類型,因此 Array 在作為表達(dá)式使用時(shí)不會(huì)拷貝副本厢岂,同一個(gè) Array 實(shí)例的所有引用都會(huì)共享同樣的數(shù)據(jù)光督。
let arr1 = [0, 1, 2]
let arr2 = arr1
arr2[0] = 3
// arr1 contains elements 3, 1, 2
// arr2 contains elements 3, 1, 2
VArray
- 倉(cāng)頡編程語(yǔ)言引入了值類型數(shù)組 VArray<T,
N 是一個(gè)固定的語(yǔ)法可帽,通過 $ 加上一個(gè) Int64 類型的數(shù)值字面量表示這個(gè)值類型數(shù)組的長(zhǎng)度。
type varr1 = VArray<Int64, $3> // Ok
type varr2 = VArray // Error
- VArray 可以由一個(gè)數(shù)組的字面量來進(jìn)行初始化窗怒,左值 a 必須標(biāo)識(shí)出 VArray 的實(shí)例化類型
var a: VArray<Int64, $3> = [1, 2, 3]
VArray的引入不知道有什么用映跟,不是很理解。
區(qū)間類型
區(qū)間類型用于表示擁有固定步長(zhǎng)的序列扬虚,使用 Range<T> 表示努隙。如最常用的 Range<Int64> 用于表示整數(shù)區(qū)間。
每個(gè)區(qū)間類型的實(shí)例都會(huì)包含 start辜昵、end 和 step 三個(gè)值荸镊。其中,start 和 end 分別表示序列的起始值和終止值堪置,step 表示序列中前后兩個(gè)元素之間的差值(即步長(zhǎng))躬存;start 和 end 的類型相同(即 T 被實(shí)例化的類型),step 類型是 Int64舀锨,并且它的值不能等于 0岭洲。
// Range<T>(start: T, end: T, step: Int64, hasStart: Bool, hasEnd: Bool, isClosed: Bool)
let r1 = Range<Int64>(0, 10, 1, true, true, true) // r1 contains 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
let r2 = Range<Int64>(0, 10, 1, true, true, false) // r2 contains 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
let r3 = Range<Int64>(10, 0, -2, true, true, false) // r3 contains 10, 8, 6, 4, 2
“左閉右開”區(qū)間的格式是 start..end : step,它表示一個(gè)從 start 開始坎匿,以 step 為步長(zhǎng)盾剩,到 end(不包含 end)為止的區(qū)間。
“左閉右閉”區(qū)間的格式是 start..=end : step替蔬,它表示一個(gè)從 start 開始告私,以 step 為步長(zhǎng),到 end(包含 end)為止的區(qū)間承桥。
let n = 10
let r1 = 0..10 : 1 // r1 contains 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
let r2 = 0..=n : 1 // r2 contains 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
let r3 = n..0 : -2 // r3 contains 10, 8, 6, 4, 2
let r4 = 10..=0 : -2 // r4 contains 10, 8, 6, 4, 2, 0
- 區(qū)間字面量中驻粟,可以不寫 step,此時(shí) step 默認(rèn)等于 1凶异,但是注意蜀撑,step 的值不能等于 0。另外唠帝,區(qū)間也有可能是空的(即不包含任何元素的空序列)
let r5 = 0..10 // the step of r5 is 1, and it contains 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
let r6 = 0..10 : 0 // Error, step cannot be 0
let r7 = 10..0 : 1 // r7 to r10 are empty ranges
let r8 = 0..10 : -1
let r9 = 10..=0 : 1
let r10 = 0..=10 : -1
Unit類型
對(duì)于那些只關(guān)心副作用而不關(guān)心值的表達(dá)式屯掖,它們的類型是 Unit玄柏。例如襟衰,print 函數(shù)、賦值表達(dá)式粪摘、復(fù)合賦值表達(dá)式瀑晒、自增和自減表達(dá)式绍坝、循環(huán)表達(dá)式,它們的類型都是 Unit苔悦。
Unit 類型只有一個(gè)值轩褐,也是它的字面量:()。除了賦值玖详、判等和判不等外把介,Unit 類型不支持其他操作。
其他地方?jīng)]見過蟋座,不知道這是干嘛的
Nothing類型
Nothing 是一種特殊的類型拗踢,它不包含任何值,并且 Nothing 類型是所有類型的子類型向臀。
break巢墅、continue、return 和 throw 表達(dá)式的類型是 Nothing券膀,程序執(zhí)行到這些表達(dá)式時(shí)君纫,它們之后的代碼將不會(huì)被執(zhí)行。其中 break芹彬、continue 只能在循環(huán)體中使用蓄髓,return 只能在函數(shù)體中使用。
其他地方?jīng)]見過舒帮,不知道這是干嘛的