HarmonyOS學習記錄3

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屬性,但是還是不顯示并且在編譯時沒有報任何錯誤。后面經過不斷的修改和嘗試之后發現只是這個輸入框組件高度和寬度的問題,所以導致輸入框太小,被擋住或者看不清

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/87490.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/87490.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/87490.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HKS201-M24 大師版 8K60Hz USB 3.0 適用于 2 臺 PC 1臺顯示器 無縫切換 KVM 切換器

HKS201-M24 8K60Hz HDMI 2.1 2x1 KVM 切換器&#xff0c;適用于 2 臺 PC&#xff0c;帶 EDID 仿真、千兆 LAN、雙充電和 USB 3.2 Gen 1 HKS201-M24 產品概述 TESmart 重新定義智能工作空間&#xff0c;無縫雙PC控制。 真正的 8K60Hz 亮度&#xff0c;具有 EDID 穩定性和超快速…

stm32f103vct6的DAC口的輸出電壓達不到3.3V

問題&#xff1a;調試時發現自己設置的DAC在最大時達不到3.3V&#xff0c;總結了原因&#xff0c;記錄下。 原因&#xff1a;使用時&#xff0c;注意有沒有其他負載&#xff0c;有的話最好給負載獨立供電&#xff0c;不要只用STM32f103的板湊活著供電&#xff0c;我的就是這個…

java8 Collectors.mapping 使用 例子 學習

java8 Collectors.mapping 使用 例子 學習 Map<String, List<String>> colorApple appleList.stream().collect(Collectors.groupingBy(Apple::getColor, Collectors.mapping(Apple::getVariety, toList()))); colorApple.forEach((k, v) -> {System.out.prin…

動態規劃-P1216 [IOI 1994] 數字三角形 Number Triangles

P1216 [IOI 1994] 數字三角形 Number Triangles 題目來源-洛谷題庫 思路 如果用貪心只是找當前的到達該點的路徑最大值&#xff0c;可能結果無法做到最優最值問題試著看能否將大問題分解成若干個小問題 走到a[i] [j ]這個點的最值來源于上一步a[i-1 ] [j]和a[i-1] [j-1]的最…

25年Java后端社招技術場景題!

一、電商領域高頻場景題1. 百萬級QPS秒殺系統設計場景需求&#xff1a;設計一個支持百萬級QPS的秒殺系統&#xff0c;要求解決超賣問題&#xff0c;保證系統高可用。技術方案&#xff1a;分層削峰&#xff1a;前端頁面靜態化按鈕防重復點擊Redis集群&#xff1a;采用Lua腳本實現…

牛客:HJ16 購物單【01背包】【華為機考】

學習要點 深入理解回溯深入理解01背包問題 題目鏈接 購物單_牛客題霸_牛客網 題目描述 解法1&#xff1a;回溯 其實此題非常符合取子集的邏輯&#xff0c;但是時間復雜度太高。通過11/14。想寫出來這個回溯過程&#xff0c;不容易。 #include <iostream> #include &l…

[學習記錄]Unity毛發渲染[URP]-Fin基礎版

鰭片法是一種在多邊形表面垂直添加許多多邊形&#xff0c;并在其上粘貼毛發紋理以營造毛茸茸的感覺的技術。這就像種植許多鰭&#xff08;就像魚身上的鰭一樣&#xff09;。本期我將在Unity6中實現一下基礎的Fin毛發&#xff0c;并不涉及光照著色。后面我會出一篇加上著色效果的…

指針篇(7)- 指針運算筆試題(阿里巴巴)

目錄 一、指針運算筆試題解析3.1 題目1&#xff1a;3.2 題目2&#xff1a;3.3 指針3&#xff1a;3.4 題目4&#xff1a;3.5 題目5&#xff1a;3.6 題目6&#xff1a;3.7 題目7&#xff1a; 總結 一、指針運算筆試題解析 3.1 題目1&#xff1a; #include<stdio.h> int m…

homebrew的一些常用方法

前言 因本人工作換到mac電腦&#xff0c;對包管理器homebrew的需求增加&#xff0c;因此將一些常用命令做如下記錄&#xff0c;本博客主要用作記錄用。 官網 macOS&#xff08;或 Linux&#xff09;缺失的軟件包的管理器 — Homebrew 常用命令 如果腳本因網絡問題無法下載…

【Python面試題】Python面試之基礎知識常見面試題3-匯總篇(精選30個)

目錄專欄導讀前言1. 字典的內存管理機制是什么&#xff1f;2. 列表的內存管理機制是什么&#xff1f;3. 元組和列表的區別4. 字符串插值的方法5. 閉包、裝飾器的原理閉包&#xff08;Closure&#xff09;裝飾器&#xff08;Decorator&#xff09;6. map、filter的區別7. range(…

【免費.NET方案】CSV到PDF與DataTable的快速轉換

CSV作為輕量級數據載體&#xff0c;在數據傳輸中占比超過70%。但其原生格式存在三大痛點&#xff1a; 可視化缺陷&#xff1a;無法直接生成可打印的報表結構限制&#xff1a;缺乏數據類型定義和關系約束安全風險&#xff1a;易被意外修改導致數據失真 因此&#xff0c;我們常…

connect的斷線重連

connect的短線重連 客戶端代碼的編寫服務器代碼的編寫總結 客戶端代碼的編寫 #include <iostream> #include <string> #include <cstring> #include <cstdlib> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h>…

通過觀看數百個外科手術視頻講座來學習多模態表征|文獻速遞-最新論文分享

Title題目Learning multi-modal representations by watching hundreds of surgical video lectures通過觀看數百個外科手術視頻講座來學習多模態表征01文獻速遞介紹外科計算機視覺領域的最新進展&#xff0c;已開始為手術室&#xff08;OR&#xff09;的新一代人工智能輔助支…

微信小程序如何實現再多個頁面共享數據

在微信小程序中&#xff0c;實現多個頁面共享數據有以下幾種常用方式&#xff0c;根據場景選擇最適合的方案&#xff1a; 全局變量&#xff08;App.js&#xff09; 適用場景&#xff1a;簡單數據共享&#xff08;非響應式&#xff09; 實現方式&#xff1a; javascript // ap…

PCIE5.0 TAG說明(ima回答)

在PCIe 5.0規范中&#xff0c;TLP&#xff08;Transaction Layer Packet&#xff09;報文的Tag字段用于標識和管理事務。以下是關于Tag的生成和使用規則和定義的詳細描述&#xff1a; Tag字段的定義 Tag字段&#xff1a;位于TLP報文的Header中&#xff0c;占用8位&#xff08…

Type-C PD快充協議智能芯片S312L詳解

1. 芯片概述 S312L 是一款智能Type-C PD協議觸發芯片&#xff0c;支持**PD3.0&#xff08;含PPS&#xff09;**及多種A口快充協議&#xff08;如QC/PE等&#xff09;&#xff0c;可自動識別并申請5V/9V/12V電壓&#xff0c;適用于快充適配器、移動電源等場景。 核心優勢&…

stm32學到什么程度可以找工作?

我重新為你寫一篇更加詳細深入的回答&#xff1a; STM32學到什么程度可以找工作&#xff1f;一個十年老兵的血淚史 寫在前面的話&#xff1a;這些年踩過的坑&#xff0c;都是血淋淋的教訓 剛看到這個問題&#xff0c;我就想起了2014年那個炎熱的夏天。 當時我剛從廈門某馬離…

基于 Elasticsearch 實現地圖點聚合

在地圖類應用中&#xff0c;當需要展示大量地理興趣點時&#xff0c;直接將所有點渲染在地圖上會導致視覺混亂&#xff0c;影響用戶體驗。為此&#xff0c;我基于 Elasticsearch 提供的 geotile_grid 和 geo_bounding_box 查詢能力&#xff0c;實現了一套高效的 POI 聚合展示方…

【Prometheus 】通過 Pushgateway 上報指標數據

Prometheus 是目前最流行的開源監控系統之一&#xff0c;其拉取&#xff08;pull&#xff09;模型非常適合服務發現和靜態目標的監控。然而&#xff0c;在某些場景下&#xff0c;例如短生命周期任務、批處理作業或無法暴露 HTTP 接口的服務&#xff0c;傳統的拉取方式并不適用。…

服務器 - - QPS與TPS介紹

1、QPS&#xff08;Queries Per Second 每秒查詢數&#xff09; 定義&#xff1a;常用于表示每秒的請求次數&#xff0c;衡量接口請求、數據庫查詢等動作的吞吐量&#xff08;單位時間內處理的數據量&#xff09; 計算&#xff1a;總請求數/請求時間&#xff0c;如&#xff1…