倉(cāng)頡之基礎(chǔ)數(shù)據(jù)類型 2024-08-28 周三

整數(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ù)字面量的類型

浮點(diǎn)數(shù)后綴與類型的對(duì)應(yīng)
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> ,其中 T 表示該值類型數(shù)組的元素類型塔粒,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)]見過舒帮,不知道這是干嘛的

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末双吆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子会前,更是在濱河造成了極大的恐慌好乐,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瓦宜,死亡現(xiàn)場(chǎng)離奇詭異蔚万,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)临庇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門反璃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人假夺,你說我怎么就攤上這事淮蜈。” “怎么了已卷?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵梧田,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng)裁眯,這世上最難降的妖魔是什么鹉梨? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮穿稳,結(jié)果婚禮上存皂,老公的妹妹穿的比我還像新娘。我一直安慰自己逢艘,他們只是感情好旦袋,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著它改,像睡著了一般猜憎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上搔课,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天胰柑,我揣著相機(jī)與錄音,去河邊找鬼爬泥。 笑死柬讨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的袍啡。 我是一名探鬼主播踩官,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼境输!你這毒婦竟也來了蔗牡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤嗅剖,失蹤者是張志新(化名)和其女友劉穎辩越,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體信粮,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡黔攒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了强缘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片督惰。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖旅掂,靈堂內(nèi)的尸體忽然破棺而出赏胚,到底是詐尸還是另有隱情,我是刑警寧澤商虐,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布觉阅,位于F島的核電站崖疤,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏留拾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一鲫尊、第九天 我趴在偏房一處隱蔽的房頂上張望痴柔。 院中可真熱鬧,春花似錦疫向、人聲如沸咳蔚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)谈火。三九已至,卻和暖如春舌涨,著一層夾襖步出監(jiān)牢的瞬間糯耍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工囊嘉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留温技,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓扭粱,卻偏偏與公主長(zhǎng)得像舵鳞,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子琢蛤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容