日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Swift 進(jìn)階(一)基礎(chǔ)語法

 新進(jìn)小設(shè)計(jì) 2022-10-28 發(fā)布于北京

Swift簡介

在學(xué)習(xí)Swift之前,我們先來了解下什么是Swift

Swift是Apple在2014年6月WWDC發(fā)布的全新編程語言,中文名和LOGO是”雨燕“

Swift之父是Chris Lattner,也是Clang編譯器的作者,LLVM項(xiàng)目的主要發(fā)起人

Swift版本

Swift歷時(shí)七年,從Swift 1.*更新到Swift 5.*,經(jīng)歷了多次重大改變,ABI終于穩(wěn)定

API(Application Programming Interface):應(yīng)用程序編程接口

  • 源代碼和庫之間的接口

ABI(Application Binary Interface):應(yīng)用程序二進(jìn)制接口

  • 應(yīng)用程序和操作系統(tǒng)之間的底層接口
  • 涉及的內(nèi)容有:目標(biāo)文件格式、數(shù)據(jù)類型的大小/布局/對齊,函數(shù)調(diào)用約定等

Swift是完全開源的,下載地址:https://github.com/apple/swift

Swift編譯原理

LLVM編譯器

LLVM編譯器一般分為前端和后端

  • 前端:主要進(jìn)行詞法分析,生成語法樹
  • 后端:生成對應(yīng)平臺的二進(jìn)制代碼

編譯流程

我們知道OC的前端是通過Clang進(jìn)行編譯的,Swift的前端是通過swiftc來編譯的

不同語言的前端可能不同,但最終都會通過編譯器的后端生成對應(yīng)平臺的二進(jìn)制代碼

-w727

整個(gè)編譯流程如下圖所示

-w525

  • Swift Code:我們編寫的Swift代碼
  • Swift AST:Swift語法樹
  • Raw Swift IL:Swift特有的中間代碼
  • Canonical Swift IL:更簡潔的Swift特有的中間代碼
  • LLVM IR:LLVM的中間代碼
  • Assembly:匯編代碼
  • Executable:二進(jìn)制代碼

關(guān)于Swift編譯流程的詳細(xì)講解可以參考以下網(wǎng)址:https:///swift-compiler/#compiler-architecture

swiftc

我們打開終端,輸入swiftc -help,會打印出相關(guān)指令,這也說明了swiftc已經(jīng)存在于Xcode中

-w890

我們可以在應(yīng)用程序中找到Xcode,然后右鍵顯示包內(nèi)容,通過該路徑找到swiftc

路徑:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

-w1175
-w788

swiftc的基本操作演練

下面我們可以通過一些swiftc的一些基本操作來了解

1.我們先新建一個(gè)Swift的命令行項(xiàng)目

-w1399
-w1076

2.然后打開終端,cdmain.swift路徑

-w890

3.然后我們輸入swiftc -dump-ast main.swift,來查看下生成的語法樹

-w890

4.我們還可以輸入swiftc -emit-sil main.swift生成最簡潔的SIL代碼

-w890

5.我們還可以輸入swiftc -emit-ir main.swift生成LLVM IR中間代碼

-w890

6.我們還可以輸入swiftc -emit-assembly main.swift生成匯編代碼

-w890

Swift基礎(chǔ)語法

Swift中打印輸入:print("Hello World")

Swift中一句代碼是可以省略分號的,但是如果多句代碼寫在一行,需要用分號隔開

Swift不用編寫main函數(shù),會以全局范圍內(nèi)的首句可執(zhí)行代碼作為入口來執(zhí)行

通過反匯編我們可以看到底層會執(zhí)行main函數(shù)

-w1084

常量和變量

常量:

1.用let定義常量,常量只能賦值一次

不用特意指明類型,編譯器會自動(dòng)進(jìn)行推斷

let a: Int = 10
let b = 20

2.它的值不要求在編譯過程中確定,但使用之前必須賦值一次

這樣寫確定了a的類型,之后再去賦值,也不會報(bào)錯(cuò)

let a: Int
a = 10

用函數(shù)給常量賦值也可以,函數(shù)是在運(yùn)行時(shí)才會確定值的,所以只要保證使用之前賦值了就行

func getNumber() -> Int {
    return 10
}

let a: Int
a = getNumber()

如果沒有給a確定類型,也沒有一開始定義的時(shí)候賦值,就會像下面這樣報(bào)錯(cuò)

-w643

變量:

1.用var定義變量

var b = 20
b = 30

2.常量、變量在初始化之前,都不能使用

-w644

注釋

1.Swift中有單行注釋和多行注釋

注釋之間嵌套也沒有問題

// 單行注釋

/*
 多行注釋
 /*
 多行注釋
 */
 
 /*
 // 注釋嵌套
 */

2.Playground里的注釋支持Markup語法(同Markdown)

Markup語法只在Playground里有效,在項(xiàng)目中無效

//: # 一級標(biāo)題

/*:
 ## 基礎(chǔ)語法
 */

可以通過Editor -> Show Raw Markup來預(yù)覽

-w299

預(yù)覽的效果如下

-w369

標(biāo)識符

1.標(biāo)識符(比如常量名、變量名、函數(shù)名)幾乎可以使用任何字符

let

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多