- Swift權(quán)威指南
- 李寧編著
- 806字
- 2019-01-02 10:22:08
第1章 未來(lái)的iOS開(kāi)發(fā)語(yǔ)言Swift語(yǔ)言介紹
蘋(píng)果(Apple)公司最近動(dòng)作還是比較多的,除了即將推出的iWatch 等新硬件產(chǎn)品外,還推出了一種新的編程語(yǔ)言Swift。可能初次接觸蘋(píng)果軟件開(kāi)發(fā)的程序員對(duì)Swift還很陌生,當(dāng)然,這也不奇怪,因?yàn)樵趯?xiě)這本書(shū)時(shí),Swift才剛剛推出。不過(guò),由于Swift出身貴族,這也注定了Swift將擁有一個(gè)美好的未來(lái),很可能成為蘋(píng)果軟件開(kāi)發(fā)體系的中堅(jiān)力量。既然Swift如此重要,作為求知欲極強(qiáng)的程序員們?cè)跄芊胚^(guò)這么一個(gè)成為國(guó)內(nèi),不!應(yīng)該說(shuō)世界上首批Swift專家的機(jī)會(huì)呢!現(xiàn)在就讓我們開(kāi)啟Swift語(yǔ)言的開(kāi)發(fā)之旅吧!
本章要點(diǎn)
□ Swift語(yǔ)言簡(jiǎn)介
□ Swift開(kāi)發(fā)環(huán)境搭建
□ 創(chuàng)建Swift工程
□ 編寫(xiě)一段簡(jiǎn)單的Swift語(yǔ)言代碼
□ 所見(jiàn)即所得的Playground
1.1 Swift語(yǔ)言的前世今生
在2014年的蘋(píng)果WWDC大會(huì)上,最大的亮點(diǎn)當(dāng)屬Swift的出現(xiàn)了。因?yàn)樘O(píng)果一貫以硬件為主,這次突然弄出了軟件,而且還是生產(chǎn)軟件的軟件:Swift語(yǔ)言。自然會(huì)引起各方的廣泛關(guān)注。國(guó)內(nèi)外在 24 小時(shí)內(nèi)推出了大量關(guān)于Swift語(yǔ)言的學(xué)習(xí)資料,甚至視頻 。我就從來(lái)沒(méi)看過(guò)一種新技術(shù)被如此關(guān)注過(guò),因?yàn)楫?dāng)年我趕上了微軟C#的首發(fā)、還有Google的Go語(yǔ)言首發(fā),關(guān)注度都沒(méi)有Swift語(yǔ)言高,看來(lái)業(yè)界對(duì)這個(gè)一直玩硬件的蘋(píng)果突然推出一種新編程語(yǔ)言還是很看好的。這么說(shuō)當(dāng)然是有證據(jù)的,就在Swift語(yǔ)言剛推出不到一個(gè)月的時(shí)間里,已經(jīng)排到了編程語(yǔ)言的第16位,這在以前從未發(fā)生過(guò)。
既然說(shuō)到Swift語(yǔ)言,那么就必須要提一下Swift的發(fā)明者Chris Lattner(可以叫他克里斯),Chris博士畢業(yè),是一個(gè)全面發(fā)展的好學(xué)生。
據(jù)說(shuō)Chris最喜歡看的IT著作是龍書(shū),還喜歡在旅游時(shí)帶這本書(shū)。別人旅游時(shí)都看小說(shuō)或看Video,這家伙卻看編譯原理的書(shū),的確高大上。高手就是與別人不一樣(就在寫(xiě)這本書(shū)時(shí),我已經(jīng)將龍、虎、鯨3本書(shū)的英文電子版放到平板電腦里了,準(zhǔn)備旅游時(shí)看)。
下面主要來(lái)談?wù)凜hris的光榮事跡。Chris在碩士畢業(yè)時(shí)提出了一套完整的運(yùn)行時(shí)編譯思想,奠定了LLVM 的發(fā)展基礎(chǔ)。在博士期間繼續(xù)領(lǐng)導(dǎo)LLVM編譯框架向前發(fā)展,并取得了長(zhǎng)足的進(jìn)步。LLVM已經(jīng)可以基于 GCC 前端編譯器的語(yǔ)義分析結(jié)果進(jìn)行編譯優(yōu)化和代碼生成,所以,Chris在2005年畢業(yè)時(shí)已經(jīng)是業(yè)界知名的編譯器專家了。
蘋(píng)果在2005年雇傭了Chris。Chris在蘋(píng)果的幾年中不僅大幅度優(yōu)化和改進(jìn)LLVM以適應(yīng)Objective-C的語(yǔ)法變革和性能要求,同時(shí)發(fā)起了CLang項(xiàng)目,旨在全面替換GCC,現(xiàn)在這個(gè)目標(biāo)已經(jīng)實(shí)現(xiàn)了。從OS X 10.9和XCode 5開(kāi)始,LLVM+GCC已經(jīng)被替換成了LLVM+CLang。
在2010年,Chris接到了一個(gè)不同尋常的任務(wù),就是為iOS和OS X平臺(tái)開(kāi)發(fā)下一代的編程語(yǔ)言,這就是現(xiàn)在看到的Swift。最初Swift完全是由Chris開(kāi)發(fā)的。只是在一年后(2011年),才陸續(xù)有若干編譯器專家加入了Swift團(tuán)隊(duì)。終于在4年后的2014年,Swift的第一個(gè)版本在蘋(píng)果的2014年WWDC大會(huì)上向我們展示了她的魅力。
1.2 Swift到底是怎樣的一種語(yǔ)言
Swift是一門博采眾長(zhǎng)的現(xiàn)代語(yǔ)言,在設(shè)計(jì)的過(guò)程中,Chris參考了Objective-C、Rust、Haskell、Ruby、Python、C#等優(yōu)秀語(yǔ)言的特點(diǎn),最終形成了目前Swift的語(yǔ)法特性。這也是為什么使用各種語(yǔ)言的程序員都能從Swift中找到自己熟悉的影子的原因。那么,Swift語(yǔ)言到底是一種怎樣的語(yǔ)言。可以從下面幾方面初步了解一下Swift語(yǔ)言。
(1)Swift是面向?qū)ο蟮摹⒕幾g型語(yǔ)言。編譯時(shí)底層需要通過(guò)LLVM 生成本地代碼才能執(zhí)行,所以效率還是很高的。
(2)Swift可以使用Cocoa和Cocoa Touch中的API。這也就意味著Swift與Objective-C一樣,擁有了一個(gè)強(qiáng)大的Framework Library。
(3)Swift吸取了很多編程語(yǔ)言的優(yōu)點(diǎn),同時(shí)Swift又具備了很多動(dòng)態(tài)語(yǔ)言的語(yǔ)法特性和交互方式,當(dāng)然,Swift本身是靜態(tài)語(yǔ)言。所以,Swift盡可能地在靜態(tài)語(yǔ)言和動(dòng)態(tài)語(yǔ)言之間尋找平衡點(diǎn)。
(4)既然說(shuō)Swift是一種擁有動(dòng)態(tài)特性的靜態(tài)語(yǔ)言,那么Swift自然就是一門類型安全的語(yǔ)言。編譯器可以在編譯過(guò)程中檢測(cè)出類型異常。例如,如果你期望為一個(gè)字符串變量賦值,那么類型安全機(jī)制會(huì)阻止你為這個(gè)變量設(shè)置整數(shù)。正是由于類型安全機(jī)制的存在,使開(kāi)發(fā)者可以更早地發(fā)現(xiàn)并修復(fù)錯(cuò)誤。
(5)支持各種高級(jí)語(yǔ)言特性,包括閉包、泛型、面向?qū)ο蟆⒍喾祷刂怠㈩愋徒涌凇⒃M、集合等。
(6)Swift能與Objective-C進(jìn)行混合編程,但代碼分屬不同的文件。
(7)全面支持Unicode編碼。也就是說(shuō),可以用任何想用的字符作為變量名,例如,一個(gè)笑臉字符或漢字。圖1-1就是使用笑臉圖標(biāo)和漢字作為變量名的一個(gè)典型例子。
▲圖1-1 使用笑臉圖標(biāo)和漢字作為變量名
(8)使分號(hào)(;)變成了可選的符號(hào)。通常的靜態(tài)語(yǔ)言,如Java、C#。每條語(yǔ)句結(jié)束后,都會(huì)在最后加上“;”,而Swift的每條語(yǔ)句不需要加“;”,當(dāng)然,加上也沒(méi)問(wèn)題。只有在兩條或多條語(yǔ)句寫(xiě)在同一行時(shí)才必須加“;”。
(9)簡(jiǎn)化和增強(qiáng)了集合數(shù)據(jù)類型。用過(guò)Java和C#的讀者知道。在這兩種語(yǔ)言中,各種集合類型不可謂不全,但太多也有它不好的地方,就是不知道使用哪個(gè)。而且這些集合數(shù)據(jù)類型的功能也不夠強(qiáng)大。在Swift語(yǔ)言中只提供了數(shù)組(Array)和字典(Dictionary)兩個(gè)集合數(shù)據(jù)類型。其中Array類似List的功能,可以修改、添加、替換和刪除數(shù)組元素。Dictionary類似Map的功能,用于存儲(chǔ)Key-Value 風(fēng)格的值。
(10)Swift可以通過(guò)元組實(shí)現(xiàn)函數(shù)返回多個(gè)值。這一功能在其他語(yǔ)言中需要通過(guò)返回一個(gè)對(duì)象或結(jié)構(gòu)體(指針)來(lái)實(shí)現(xiàn)。
(11)提供了優(yōu)雅的閉包解決方案。例如,在排序函數(shù) sort 中可以將函數(shù)作為參數(shù)值傳遞。下面的代碼是一種典型的寫(xiě)法:
let array1 = ["X", "A", "1", "2", "Z"]
func backwards(s1: String, s2: String) -> Bool
{
return s1 > s2
}
var array2 = sort(array1, backwards)
當(dāng)然,更簡(jiǎn)潔的寫(xiě)法是var array2 = sort(["X", "A", "1", "2", "Z"] ) { $0 > $1 },如果讀者不明白這么寫(xiě)是什么意思,那么就繼續(xù)往后看吧!
(12)Swift語(yǔ)言中提供了一種可選變量(Optional)。主要是為了應(yīng)對(duì)一個(gè)變量可能存在,也可以是 nil 的情況。例如,將一個(gè)字符串(String)轉(zhuǎn)換為整數(shù)(Int),但這個(gè)字符串是否可以成功轉(zhuǎn)換為整數(shù)呢?如果不確定,就返回一個(gè)可選變量。如果成功轉(zhuǎn)換,則返回正常的整數(shù)值;如果轉(zhuǎn)換失敗,則返回nil。實(shí)現(xiàn)的代碼如下:
let str = "126CB5"
let value = str.toInt() // value是一個(gè)可選常量(用let聲明是常量,用var聲明是變量)
這時(shí),value就是一個(gè)可選變量。要想判斷轉(zhuǎn)換是否成功,可以使用下面的代碼:
if value
{
// 如果value是可選變量,引用時(shí)需要加上“!”,
// 表示該選項(xiàng)變量中肯定有一個(gè)值
println(value!)
}
可選變量的引入解決了大部分需要顯式處理的異常,這部分工作也扔給編譯器去做了。
(13)擁有不同意義的nil。在Swift中的nil和Objective-C中的nil不同。在Objective-C中,nil是指向不存在對(duì)象的指針,而在Swift里,nil不是指針,它表示特定類型的值不存在。所有類型的可選值都可以被設(shè)置為nil,不僅是對(duì)象類型。
(14)Swift中沒(méi)有從語(yǔ)言層面支持異步和多核,不過(guò)可以直接在Swift中復(fù)用GCD(Grand Central Dispatch)的API實(shí)現(xiàn)異步功能。
(15)Swift沒(méi)有一部處理機(jī)制。可能是認(rèn)為有了可選變量,異常會(huì)很少使用,所以未加入異常處理。
1.3 Swift開(kāi)發(fā)環(huán)境搭建
盡管Swift語(yǔ)言擁有獨(dú)立的編譯器,不過(guò),目前Apple并沒(méi)有單獨(dú)發(fā)布Swift開(kāi)發(fā)包。所以只能連同XCode 6一起安裝來(lái)使用Swift語(yǔ)言。由于XCode 6仍然是Beta版,所以,Apple并未對(duì)所有的人開(kāi)放下載XCode 6,只有擁有蘋(píng)果開(kāi)發(fā)者賬號(hào) 的用戶才允許下載XCode 6 Beta版。如果讀者不舍得那99美金也不要緊,我已經(jīng)將XCode 6 Beta的安裝文件上傳到的網(wǎng)盤(pán),下載地址是http://pan.baidu.com/s/1hq7mAOk,下載后是一個(gè)dmg文件(2.33G左右),直接在Mac OS X下雙擊安裝即可。XCode 6是可以和Xcode 5或其他版本共存的,所以不必?fù)?dān)心,盡管安裝。
安裝完后,在 Mac的“應(yīng)用程序”列表中多了一個(gè)“Xcode6-Beta.app”,直接雙擊運(yùn)行即可。成功運(yùn)行后,點(diǎn)擊XCode6中的“Xcode”>“About Xcode”菜單項(xiàng),如果能看到如圖1-2 所示的窗口,并且 Version 顯示的是 6.0,則說(shuō)明 XCode6 已經(jīng)安裝成功了。

▲圖1-2 XCode 6的About 窗口
1.4 創(chuàng)建Swift工程(OS X和iOS平臺(tái))
Swift 語(yǔ)言可以開(kāi)發(fā) iOS 和 OS X 兩個(gè)平臺(tái)的程序,讀者可以選擇自己喜歡的平臺(tái)學(xué)習(xí)Swift語(yǔ)言。如果有蘋(píng)果開(kāi)發(fā)者賬號(hào)的,最好選擇iOS平臺(tái),因?yàn)榭梢栽趇Phone上測(cè)試全部的功能。如果沒(méi)有開(kāi)發(fā)者賬號(hào),可以考慮選擇OS X 平臺(tái),否則就只能在iOS模擬器上測(cè)試Swift 程序了。不管是創(chuàng)建哪個(gè)類型的工程,首先需要點(diǎn)擊“File”>“New”>“Project”菜單項(xiàng)打開(kāi)如圖1-3所示的工程模板選擇窗口。

▲圖1-3 創(chuàng)建 iOS 工程
如果選擇iOS平臺(tái),通常選擇“Application”,然后在右側(cè)工程模板列表中選擇一個(gè),如“Single View Application”,如 圖1-3所示。
如果讀者選擇 OS X 平臺(tái),可以選擇“Application”,并在右側(cè)的工程模板列表中選擇“Command Line Tool”(一個(gè)終端工程模板),如圖1-4所示。

▲圖1-4 創(chuàng)建Mac工程
接下來(lái)可以點(diǎn)擊“Next”按鈕進(jìn)入下一步的設(shè)置。在下一步中需要輸入工程名和工程支持的語(yǔ)言(為了測(cè)試方便,這里選擇了OS X 平臺(tái),等涉及iOS 部分時(shí),再創(chuàng)建iOS 工程)。當(dāng)然,我們需要選擇“Swift”,如圖1-5所示,然后點(diǎn)擊“Next”按鈕進(jìn)入下一步。在下一步中需要選擇一個(gè)用于存放工程的目錄,選擇完成后,點(diǎn)擊“Create”按鈕,就會(huì)創(chuàng)建一個(gè)OS X工程。

▲圖1-5 建立 iOS工程,選擇 Swift 語(yǔ)言
圖1-5是OS X 工程的機(jī)構(gòu),其中新創(chuàng)建了一個(gè)main.swift文件。該文件用于輸入Swift語(yǔ)言的代碼。
在main.swift文件中默認(rèn)生成了如下的代碼:
import Foundation
println("Hello, World!")
直接運(yùn)行該工程,就會(huì)在輸出視圖中輸出“Hello, World!”。
如果讀者要建立 iOS for Swift 工程,這里假設(shè)選擇了圖1-3 所示的“Single View Application”模板,在下一個(gè)設(shè)置頁(yè)面輸入工程名(如 first_swift_ios)后再進(jìn)入下一個(gè)設(shè)置頁(yè)面,選擇存儲(chǔ)目錄后可創(chuàng)建iOS工程,工程結(jié)構(gòu)如圖1-7所示。
▲圖1-6 OS X 工程結(jié)構(gòu)
▲圖1-7 iOS 工程結(jié)構(gòu)
如果運(yùn)行這個(gè)工程,首先會(huì)啟動(dòng)iOS模擬器(要選擇iOS8模擬器),然后在模擬器中會(huì)運(yùn)行一個(gè) iOS 程序,該程序并沒(méi)有任何 UI,背景為白色。本書(shū)后面的章節(jié)會(huì)介紹如何使用Swift開(kāi)發(fā)iOS應(yīng)用和游戲。
對(duì)于只想學(xué)習(xí)一下Swift語(yǔ)言的讀者,建議還是使用OS X終端程序?yàn)楹茫驗(yàn)镺S X終端程序運(yùn)行快速簡(jiǎn)單,可以排除其他的干擾。
1.5 瞧一瞧Swift到底長(zhǎng)啥樣
可能很多讀者看到前面的介紹后躍躍欲試,想試一試 Swift 語(yǔ)言,不過(guò)先別忙,在正式編寫(xiě)Swift語(yǔ)言之前,先了解一下Swift語(yǔ)言的語(yǔ)法和樣式是非常必要的。就像搞對(duì)象,起碼得先看看對(duì)方長(zhǎng)啥樣,然后才能進(jìn)行下一步。現(xiàn)在就讓我們看看Swift到底長(zhǎng)啥樣。
Swift 語(yǔ)言和其他語(yǔ)言(如 Java、C#、Objective-C)類似,也支持一些常規(guī)的操作和語(yǔ)法元素,例如,運(yùn)算符(+、?、*、/、%、++、&&、||等)、數(shù)據(jù)類型(字符串、數(shù)值等)、控制語(yǔ)句(if、switch、for)、類、方法(函數(shù))等。不過(guò) Swift 添加了很多特有的語(yǔ)法元素(至少是大多數(shù)語(yǔ)言都不具備的技術(shù)),例如,類擴(kuò)展、增強(qiáng)的switch語(yǔ)句、小標(biāo)、元組類型、返回多種的方法(函數(shù))等。下面是一段標(biāo)準(zhǔn)的Swift語(yǔ)言代碼,盡管沒(méi)有枚舉Swift中所有的新特性,但足夠讓我們充分了解 Swift 語(yǔ)言的基本語(yǔ)法規(guī)則。如果讀者對(duì)某些表達(dá)式不理解也沒(méi)關(guān)系,在后面的章節(jié)會(huì)深入介紹這些特有的語(yǔ)法規(guī)則。
import Foundation
var value1 = 20 // 定義并初始化一個(gè)整型變量
value1 += 35
// 輸出:value1=55
println("value1=\(value1)")
let value2 = 42 // 定義并初始化一個(gè)整型常量
// 輸出:97
println(value1 + value2)
// 定義并初始化一個(gè)數(shù)組變量
var array1 = ["abc","bbb","ccc"]
// 枚舉數(shù)組中的每一個(gè)元素值
// 輸出:abc bbb ccc
for element in array1
{
print(element + " ")
}
// 定義函數(shù),返回值類型是String
func getPerson(name: String, age:Int) -> (String)
{
return "name:" + name + " age:" + toString(age)
}
println()
// 調(diào)用getPerson函數(shù)
let person = getPerson("bill", 50)
// 輸出:person:name:bill age:50
println("person:\(person)")
// 定義一個(gè)可以返回多個(gè)值的函數(shù)(返回兩個(gè)值:name和price)
func getProduct() -> (name:String, price:Float)
{
return ("iPhone6", 6666.66)
}
// 輸出:(iPhone6, 6666.66015625)
// 調(diào)用getProduct函數(shù),并輸出其返回值
println(getProduct())
// 輸出:product name: iPhone6
// 輸出getProduct函數(shù)返回name值
println("product name: \(getProduct().name)")
// 定義Country類
class Country
{
var name = "China"
let area: Float = 960
// 定義一個(gè)成員方法
func getDescription() -> String {
return "Country:\(name) Area:\(area)"
}
}
// 創(chuàng)建一個(gè)Country類型的常量
let country = Country()
// 輸出:Country:China Area:960.0
// 調(diào)用Country.getDescritpion方法,并輸出該方法的返回值
println(country.getDescription())
// 定義一個(gè)類擴(kuò)展,相當(dāng)于將一個(gè)類的某一部分拿出來(lái)單獨(dú)定義
extension Country
{
// 為Country類添加一個(gè)方法
func getAddress() -> (planet: String, location:String)
{
return ("Earth","Asia")
}
}
// 輸出:Planet:Earth
// 調(diào)用擴(kuò)展方法getAddress,并輸出返回值中的planet
println("Planet:\(country.getAddress().planet)")
// 輸出:Location:Asia
// 調(diào)用擴(kuò)展方法getAddress,并輸出返回值中的location
println("Location:\(country.getAddress().location)")
如果執(zhí)行上面這段代碼,會(huì)輸出如下的信息。
value1=55
97
abc bbb ccc
person:name:bill age:50
(iPhone6,6666.66015625)
productname: iPhone6
Country:China Area:960.0
Planet:Earth
Location:Asia
1.6 所見(jiàn)即所得的Playground
XCode 6新增加了一個(gè)Playground,在iOS和OS X工程中都可以使用Playground。這個(gè)東西其實(shí)就是一個(gè)所見(jiàn)即所得的寫(xiě)代碼的文件。這里的所見(jiàn)即所得就是編寫(xiě)代碼后,不需要運(yùn)行,立刻會(huì)顯示出結(jié)果,并且還可以顯示出代碼中某個(gè)變量/常量的當(dāng)前值。Playground比較適合于測(cè)試Swift語(yǔ)言的代碼。但Playground在輸出結(jié)果時(shí)可能會(huì)有些慢,而且寫(xiě)代碼時(shí)會(huì)有些遲鈍。這可能是因?yàn)樾枰獙?shí)時(shí)解釋Swift代碼的原因!
要想使用 Playground,需要先創(chuàng)建 Swift 工程(iOS 和 OS X 工程都可以),然后在當(dāng)前工程中點(diǎn)擊“File”>“New”>“File”菜單項(xiàng),會(huì)彈出一個(gè)如圖1-8所示的窗口。在“iOS”和“OS X”中都有一個(gè)“source”節(jié)點(diǎn),在該節(jié)點(diǎn)中都有一個(gè)“Playground”模板。不管是什么工程,選擇哪個(gè)“source”節(jié)點(diǎn)下的“Playground”都可以。

▲圖1-8 選擇“Playground”模板
選擇“Playground”模板后,進(jìn)入下一個(gè)設(shè)置頁(yè)面。在該設(shè)置頁(yè)面中需要選擇playground文件的存儲(chǔ)目錄,通常和 Swift 文件放在同一個(gè)目錄中。如果下方的“Targets”列表中的工程未選擇,需要選擇該工程,效果如圖1-9所示。

▲圖1-9 創(chuàng)建 Playground 文件
如果成功創(chuàng)建了Playground文件,在工程目錄中會(huì)多了一個(gè)文件擴(kuò)展名為“playground”的文件。默認(rèn)是 MyPlayground.playground。如果讀者將上一節(jié)的代碼都復(fù)制到MyPlayground.playground文件中,就會(huì)在代碼右側(cè)輸出相應(yīng)的結(jié)果,并且在輸出結(jié)果和代碼之間的部分還會(huì)顯示當(dāng)前變量/常量的當(dāng)前值,效果如圖1-10所示。

▲圖1-10 Playground 的效果
1.7 小結(jié)
相信看完本章后,讀者已經(jīng)對(duì) Swift 語(yǔ)言有了一個(gè)大致的了解。也學(xué)會(huì)了如何搭建實(shí)驗(yàn)環(huán)境。不過(guò)真正的Swift開(kāi)發(fā)之旅才剛剛開(kāi)始。后面還有Swift的語(yǔ)法、內(nèi)置函數(shù)、iOS應(yīng)用程序開(kāi)發(fā)、基于SpriteKit游戲引擎的游戲程序開(kāi)發(fā)等知識(shí)要學(xué)習(xí)。下面就讓我們整裝待發(fā),去欣賞Swift給我們的一次又一次震撼吧!
- Android平板電腦開(kāi)發(fā)實(shí)戰(zhàn)詳解和典型案例
- 深入理解Net-Snmp
- Android 網(wǎng)絡(luò)開(kāi)發(fā)與應(yīng)用實(shí)戰(zhàn)詳解
- 百度SEO一本通
- 手機(jī)軟件測(cè)試最佳實(shí)踐
- 搜索引擎與程序化廣告:原理、設(shè)計(jì)與實(shí)戰(zhàn)
- 建筑運(yùn)維智慧管控平臺(tái)設(shè)計(jì)與實(shí)現(xiàn)
- BERT基礎(chǔ)教程:Transformer大模型實(shí)戰(zhàn)
- 混沌工程:通過(guò)可控故障實(shí)驗(yàn)提升軟件系統(tǒng)可靠性
- 36個(gè)創(chuàng)意電子小制作:安全衛(wèi)士
- Spring Boot+Vue 3大型前后端分離項(xiàng)目實(shí)戰(zhàn)
- 軟件工程:理論與實(shí)踐(第2版)
- 鋒利的jQuery(第2版)
- 云原生Kubernetes全棧架構(gòu)師實(shí)戰(zhàn)
- IEC算法及其在多目標(biāo)優(yōu)化中的應(yīng)用