HarmonyOS學習記錄3
本文為個人學習記錄,僅供參考,如有錯誤請指出。本文主要記錄ArkTS基礎語法,僅記錄了部分我覺得與其他語言不太類似的地方,具體規范請參考官方文檔。
參考官方文檔:https://developer.huawei.com/consumer/cn/training/course/slightMooc/C101717496870909384
什么是ArkTS
ArkTS是一種設計用于構建高性能應用的編程語言。它在繼承TypeScript語法的基礎上進行了優化,以提供更高的性能和開發效率。許多編程語言在設計之初沒有考慮到移動設備,導致應用的運行緩慢、低效、功耗大,隨著移動設備在人們的日常生活中變得越來越普遍,針對移動環境的編程語言優化需求也越來越多。ArkTS是專為解決這些問題而設計的,聚焦于提高運行效率。TypeScript是在JavaScript基礎上通過添加類型定義擴展而來的,ArkTS則是TypeScript的進一步擴展。TypeScript提供了一種更結構化的JavaScript編碼方法,深受開發者喜愛。ArkTS保持了TypeScript的大部分語法,旨在為現有的TypeScript開發者實現無縫過渡,幫助移動開發者快速上手。ArkTS的一大特性是它專注于低運行時開銷。ArkTS對TypeScript的動態類型特性施加了更嚴格的限制,以減少運行時開銷,提高執行效率。通過取消動態類型特性,ArkTS代碼能更有效地被運行前編譯和優化,從而實現更快的應用啟動和更低的功耗。ArkTS語言設計中考慮了與TypeScript和JavaScript的互通性。許多移動應用開發者希望重用TypeScript和JavaScript代碼及庫,因此ArkTS提供與TypeScript和JavaScript的無縫互通,使開發者可以輕松集成TypeScript和JavaScript代碼到應用中,充分利用現有代碼和庫進行ArkTS開發。
聲明
ArkTS通過聲明引入變量、常量、類型和函數
變量聲明
使用關鍵字let聲明的變量可以在程序執行期間具有不同的值
let a : string = 'hello';
a = 'hello,world';
產量聲明
使用關鍵字const聲明的只讀常量只能被賦值一次。注意,對常量重新賦值會造成編譯時報錯
const a : string = 'hello';
自動類型判斷
由于ArkTS是一種靜態類型語言,所有數據的類型都必須在編譯時確定,如果常量或者變量在聲明時就包含了初始值,則不需要顯式指定其類型,ArkTS會自動根據場景自動推斷類型,如下兩種聲明方式都是有效的,并且兩個變量都是string類型
let a1 : string = 'hello';
let a2 = 'hello,a';
數據類型
-
number類型:在ArkTS中任何整數和浮點數都可以被賦值給此類型的變量,其范圍包括:
- 整數字面量包括以下類別:
- 十進制整數,由數字序列組成。例如:0、117、-345
- 十六進制整數,以0x(或0X)開頭,包含數字(0-9)和字母a-f或A-F。例如:0x1123、0x00111、-0xF1A7
- 八進制整數,以0o(或0O)開頭,只能包含數字(0-7)。例如:0o777
- 二進制整數,以0b(或0B)開頭,只能包含數字0和1。例如:0b11、0b0011、-0b11
- 可表示的最大整數范圍:-9007199254740991~9007199254740991,超出范圍時可用bigint類型來確保精度
- ?浮點數字面量包括以下部分:
- 十進制整數,可為有符號數(前綴為“+”或“-”)
- 小數點(“.”)
- 小數部分(由十進制數字字符串表示)
- 指數部分,以“e”或“E”開頭,后跟有符號(前綴為“+”或“-”)或無符號整數
- 整數字面量包括以下類別:
-
boolean類型:true和false
-
string類型:字符串字面量由單引號(')或雙引號(")之間括起來的零個或多個字符組成。字符串字面量還有一特殊形式,是用反向單引號(`)括起來的模板字面量
-
void類型
-
Object類型:此類型是所有引用類型的基類型。任何值,包括基本類型的值,都可以直接被賦給Object類型的變量(基本類型值會被自動裝箱)
-
array類型:array類型,即數組,是由可賦值給數組聲明中指定的元素類型的數據組成的對象。數組可由數組復合字面量賦值。數組復合字面量是用方括號括起來的零個或多個表達式列表,每個表達式為數組中的一個元素。數組的長度由數組中元素的個數確定。注意,數組中第一個元素的索引為0
-
enum類型:枚舉類型
-
Union類型:即聯合類型,是由多個類型組合成的引用類型
-
Aliases類型:為匿名類型(數組、函數、對象自面量或聯合類型)提供名稱,或為已有類型提供替代名稱
可見性修飾符
- Public(公有)
- Private(私有)
- Protect(受保護):protected修飾符的作用與private修飾符非常相似,不同點是protected修飾的成員允許在派生類中訪問,例如:
class Base {protected x: string = '';private y: string = '';
}
class Derived extends Base {foo() {this.x = 'a'; // OK,訪問受保護成員this.y = 'b'; // 編譯時錯誤,'y'不可見,因為它是私有的}
}
空安全
默認情況下,ArkTS中的所有類型都不允許為空,這類似于TypeScript的(strictNullChecks)模式,但規則更嚴格。在下面的示例中,所有行都會導致編譯時錯誤:
let x: number = null; // 編譯時錯誤
let y: string = null; // 編譯時錯誤
let z: number[] = null; // 編譯時錯誤
可以為空值的變量定義為聯合類型T | null:
let x: number | null = null;
x = 1; // ok
x = null; // ok
if (x != null) { /* do something */ }
嘗試完成一個Demo
本文只記錄一些核心部分的代碼以及遇到的問題,源碼請查看官方鏈接
項目結構
├──entry/src/main/ets/
│ ├──common
│ │ ├──constants
│ │ │ └──Constants.ets // 常量類
│ │ └──utils
│ │ ├──CommonUtils.ets // 彈窗工具類
│ │ ├──Logger.ets // 日志工具類
│ │ └──Method.ets // 算法工具類
│ ├──entryability
│ │ └──EntryAbility.ets
│ ├──entrybackupability
│ │ └──EntryBackupAbility.ets
│ ├──pages
│ │ └──Index.ets // 界面實現
│ └──view
│ ├──DaffodilsNumberCustomDialog.ets // 水仙花數彈窗實現
│ ├──IsLeapYearCustomDialog.ets // 閏年判斷數彈窗實現
│ ├──IsPalindromicStringCustomDialog.ets // 回文字符串判斷數彈窗實現
│ ├──MultiplicationTableCustomDialog.ets // 九九乘法表彈窗實現
│ └──StringReversalCustomDialog.ets // 字符串反轉彈窗實現
└───entry/src/main/resources // 應用資源目錄
項目效果
核心代碼
整體布局還是比較好寫的,主要是這些按鈕具體的實現方法比較麻煩,所以直接復制了官方的方法,在布局中綁定到對應的組件即可
// Method.ets// 水仙花數
export function daffodilsNumber(): number[] {let result: number[] = [];for (let i = 100; i < 1000; i++) {let unitsDigit: number = i % 10;let tenthsDigit: number = Math.floor(i / 10) - Math.floor(i / 100) * 10;let hundredthsDigit: number = Math.floor(i / 100);if (i === unitsDigit * unitsDigit * unitsDigit + tenthsDigit * tenthsDigit * tenthsDigit +hundredthsDigit * hundredthsDigit * hundredthsDigit) {result.push(i);}}return result;
}// 九九乘法表
export function multiplicationTable(): string[][] {let result: string[][] = [];for (let i = 1; i <= 9; i++) {let index: string[] = [];for (let j = 1; j <= i; j++) {let temp: string = j + ' * ' + i + ' = ' + i * j;index.push(temp);}result.push(index);}return result;
}// 回文判斷
export function isPalindromicString(content: string): boolean {let result: boolean = true;let i: number = 0;let j: number = content.length - 1;while (i <= j) {if (content.charAt(i) !== content.charAt(j)) {result = false;break;}i++;j--;}return result;
}// 字符串反譯
export function StringReversal(content: string): string {let result: string = '';for (let index = content.length - 1; index >= 0; index--) {result += content.charAt(index);}return result;
}// 閏年判斷
export function isLeapYear(year: number): boolean {let result: boolean = false;if ((year % 4 === 0 && year % 100 !== 0) || (year % 400 === 0)) {result = true;} else {result = false;}return result;
}
遇到的問題
-
首先我遇到項目中需要顯示Toast彈窗,但是ArkTS好像準備棄用直接調用Toast方法,所以需要創建一個類用于顯示Toast彈窗,于是我參考了官方的代碼自定義了一個Toast彈窗的類,并且在需要的地方調用了類中自定義的ShowToast方法,但是在編譯時一直報錯,顯示TypeError,類型錯誤,所以我接著檢查了方法定義時需要輸入的數值的類型,也檢查了輸出的數值類型,都是對應的,沒有問題。最后通過AI的幫助我才發現其實是這個Toast類為undefined的原因,也就是在上述知識點中提到的空安全的問題,沒有在調用前進行初始化,所以根據官方教程進行編寫的話,記得在實例化類之前在entry > src > main > ets > entryability > EntryAbility.ets文件中的onWindowStageCreate函數中添加對應的類的初始化
-
遇到了輸入框輸入文字之后沒有內容顯示。第一次遇到這個問題時,我以為是文字顏色和背景色相同的問題,所以修改TextInput組件的.fontcolor屬性,但是還是不顯示并且在編譯時沒有報任何錯誤。后面經過不斷的修改和嘗試之后發現只是這個輸入框組件高度和寬度的問題,所以導致輸入框太小,被擋住或者看不清