一個(gè)公司設(shè)計(jì)網(wǎng)站怎么做近三天發(fā)生的大事
文章目錄
- 引子
- Xcode工程結(jié)構(gòu)核心概念
- Swift語法速記(TODO)
- 小技巧
- 單元測試中使用await
- SwiftUI中使用List
- View中取數(shù)據(jù)
- 常見問題
- Xcode添加package時(shí)連接github超時(shí)
- Xcode無法修改快捷鍵,一閃而過
引子
鑒于React Native目前版本在iOS上開發(fā)遇到諸多問題,本以為搞RN只需理會(huì)Javascript開發(fā),沒想到冒出CocoaPod的一堆編譯問題。所以橫下一條心,決定直接進(jìn)攻iOS本身。不管你是用React Native,還是用Flutter,iOS下的直接編程Swift或OC都是繞不過去的坎。
Xcode比Android Studio要香,模擬器運(yùn)行快,當(dāng)然配置更復(fù)雜。
十年前的2014年,蘋果發(fā)布了Swift , 五年后的2019年,又發(fā)布SwiftUI。從此iOS開發(fā)的面貌煥然一新。
Swift 的最新版本是Swift 5.5,該版本于2021 年9 月發(fā)布。
SwiftUI 是Apple 開發(fā)的一種UI 框架,它首次在iOS 13 中引入,支持iOS、iPadOS、macOS、watchOS 和tvOS 等Apple 平臺(tái)。 當(dāng)前最新版本的SwiftUI 是在Xcode 13 中引入的SwiftUI 3.0。
Xcode工程結(jié)構(gòu)核心概念
每一門編程語言都會(huì)有namespace, module, package這些基本概念,但定義上都存在一些差異。這些差異會(huì)影響到加載和相互調(diào)用關(guān)系。所以,學(xué)習(xí)一門編程語言,首要是弄清楚這些基本概念是如何定義的。
Xcode里有兩個(gè)概念和其它開發(fā)工具不同,一個(gè)叫Schema,一個(gè)叫Target。Schema可以理解為解決方案,一個(gè)Schema可以對應(yīng)不同的Target,生成物也不同。
- Project和Workspace
- Package:包是Swift Package Manager的概念,不是Swift語言的概念,包的根目錄下需要存在一個(gè)Package.swift描述文件
- Target: 通常也被稱為build target,也就是構(gòu)建的目標(biāo)
- 在創(chuàng)建項(xiàng)目的時(shí)候默認(rèn)就會(huì)創(chuàng)建一個(gè)target,有時(shí)被稱為主target
- 一個(gè)工程里可以創(chuàng)建多個(gè)target,每個(gè)target都對應(yīng)相應(yīng)的模板
- 一個(gè)包里可以有一個(gè)或多個(gè)target,也就是一個(gè)target列表。
- 一個(gè)target是一個(gè)app bundle 或 framework。每個(gè)target構(gòu)建后對應(yīng)一個(gè)庫或一個(gè)可執(zhí)行文件作為product。
- target之間存在依賴關(guān)系,可以在Xcode里定義某個(gè)target依賴哪些其它target
- Module:很多編程語言里一個(gè)文件對應(yīng)一個(gè)module,但Swift不是。
- 模塊是代碼的集合,對應(yīng)一個(gè)或多個(gè)文件,里面定義Swift的 類、函數(shù)等
- 一個(gè)模塊對應(yīng)一個(gè)發(fā)布單元
- 一個(gè)module就可以看成是一個(gè)project中的一個(gè)target,這個(gè)target的默認(rèn)模塊名稱就是這個(gè)項(xiàng)目的名稱(可以在target的Build Settings—Product Module Name配置)
- 在同一個(gè)模塊中所有的Swift類處于同一個(gè)命名空間,它們之間不需要導(dǎo)入就可以相互訪問
- namespace: 一個(gè)class或一個(gè)struct就定義一個(gè)namespace,或者說一個(gè){}就對應(yīng)一個(gè)namespace
- Swift有命名空間,而Objective-C沒有。
- Swift并沒有namespace這個(gè)關(guān)鍵字
- Bundle:Xcode 工程項(xiàng)目本身就是在一個(gè) Bundle 之下,開發(fā)者可以使用 Bundle.main 來獲取其中的資源
- Library 和 Framework:
Modules: Swift organizes code into modules. Each module specifies a namespace and enforces access controls on which parts of that code can be used outside of the module.
A program may have all of its code in a single module, or it may import other modules as dependencies. Aside from the handful of system-provided modules, such as Darwin on macOS or Glibc on Linux, most dependencies require code to be downloaded and built in order to be used.
When you use a separate module for code that solves a particular problem, that code can be reused in other situations. For example, a module that provides functionality for making network requests can be shared between a photo sharing app and a weather app. Using modules lets you build on top of other developers’ code rather than reimplementing the same functionality yourself.
Packages: A package consists of Swift source files and a manifest file. The manifest file, called Package.swift, defines the package’s name and its contents using the PackageDescription module.
A package has one or more targets. Each target specifies a product and may declare one or more dependencies.
namespace與文件名和路徑無關(guān),只與模塊名有關(guān)。這一點(diǎn)不同于Java和Python。在Xcode中,創(chuàng)建group和folder是有區(qū)別的,group參與編譯,創(chuàng)建group可以選擇不創(chuàng)建folder,folder下文件不參與編譯。folder是藍(lán)色的,它是以文件夾的形式存在;group是黃色的,它是以分組的概念存在。
Swift工程結(jié)構(gòu)示例:
不管你是Run,還是Build,首先要明確你是針對哪個(gè)Schema。如下,你要選擇對應(yīng)的Schema才行。
創(chuàng)建了兩個(gè)Target,其中一個(gè)是Unit Test,依賴主target。
Swift語法速記(TODO)
每一門編程語言都喜歡用不同的方式做和別人相同的事情。不知道這是故意標(biāo)新立異,還是真的有某種道理,難道設(shè)計(jì)者不知道Java和C的語言風(fēng)格已經(jīng)成了大眾的習(xí)慣嗎?對于程序員來說只能選擇接受。例如定義函數(shù)的關(guān)鍵字就有def, func, function等,Swift也不例外,也搞了一套自己的語法糖。
- 常量用let,變量用var
- 函數(shù)參數(shù)有標(biāo)簽,有名稱,返回類型用箭頭,傳參需帶參數(shù)名,要吐:-)
- 字符串可以用單引號(hào)或雙引號(hào),多行字符串用三個(gè)單引號(hào)或三個(gè)雙引號(hào)
- 數(shù)組、Set、字典都是用中括號(hào)定義,都可以用for-in遍歷
var shoppingList: [String] = ["Eggs", "Milk"] //數(shù)組
var favoriteGenres: Set<String> = ["Rock", "Classical", "Hip hop"] // 集合
var airports: [String: String] = ["YYZ": "Toronto Pearson", "DUB": "Dublin"] // 字典
- as, as?, as!的區(qū)別:as向上轉(zhuǎn),as!向下轉(zhuǎn)。不確定向下轉(zhuǎn)型可以成功時(shí),用類型轉(zhuǎn)換的條件形式(as?),只有你可以確定向下轉(zhuǎn)型一定會(huì)成功時(shí),才使用強(qiáng)制形式(as!)
- ??左邊為nil的時(shí)候,取右邊
- 擴(kuò)展: 擴(kuò)展可以給一個(gè)現(xiàn)有的類,結(jié)構(gòu)體,枚舉,還有協(xié)議添加新的功能。類似與Javascript的原型機(jī)制
- 協(xié)議:類似于Java的接口
- subscript:用來索引對象。下標(biāo)可以定義在類、結(jié)構(gòu)體和枚舉中,是訪問集合、列表或序列中元素的快捷方式。
- guard, if…else, if let用法的區(qū)別
- ForEach需要item符合 Identifiable協(xié)議,如 ForEach(items, id: .pageId){}
- mutating關(guān)鍵字
- any和some:any 吾不知其為何物也,some 吾知其為何物,但不知道其具體實(shí)例
小技巧
單元測試中使用await
func testImageFetching() async throws {let (data, _) = try await URLSession.shared.data(from: url)
}
SwiftUI中使用List
List {ForEach(items, id: \.id) { item inText(item.name)}
}
View中取數(shù)據(jù)
.task is iOS 15+, so could go back to .onAppear if you need iOS 13+.
常見問題
Xcode添加package時(shí)連接github超時(shí)
由于Xcode不能直接設(shè)置代理,所以穩(wěn)妥方式是手工下載github代碼,再添加時(shí)選Local:
刷新幾把Xcode,有時(shí)需要關(guān)閉項(xiàng)目或關(guān)閉Xcode再重啟,然后給target添加上對這些包的依賴即可:
官方給的解決方案是:
On the terminal xcodebuild -scmProvider system -resolvePackageDependencies -disablePackageRepositoryCache -workspace MyProject.xcworkspace -scheme MyScheme
On XCode after the xcodebuild finishes XCode - File - Packages - Resolve Package Versions.
Xcode無法修改快捷鍵,一閃而過
輸入法改成自帶的英文,不要用搜狗