一個公司設計網(wǎng)站怎么做近三天發(fā)生的大事
文章目錄
- 引子
- Xcode工程結構核心概念
- Swift語法速記(TODO)
- 小技巧
- 單元測試中使用await
- SwiftUI中使用List
- View中取數(shù)據(jù)
- 常見問題
- Xcode添加package時連接github超時
- Xcode無法修改快捷鍵,一閃而過
引子
鑒于React Native目前版本在iOS上開發(fā)遇到諸多問題,本以為搞RN只需理會Javascript開發(fā),沒想到冒出CocoaPod的一堆編譯問題。所以橫下一條心,決定直接進攻iOS本身。不管你是用React Native,還是用Flutter,iOS下的直接編程Swift或OC都是繞不過去的坎。
Xcode比Android Studio要香,模擬器運行快,當然配置更復雜。
十年前的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 平臺。 當前最新版本的SwiftUI 是在Xcode 13 中引入的SwiftUI 3.0。
Xcode工程結構核心概念
每一門編程語言都會有namespace, module, package這些基本概念,但定義上都存在一些差異。這些差異會影響到加載和相互調用關系。所以,學習一門編程語言,首要是弄清楚這些基本概念是如何定義的。
Xcode里有兩個概念和其它開發(fā)工具不同,一個叫Schema,一個叫Target。Schema可以理解為解決方案,一個Schema可以對應不同的Target,生成物也不同。
- Project和Workspace
- Package:包是Swift Package Manager的概念,不是Swift語言的概念,包的根目錄下需要存在一個Package.swift描述文件
- Target: 通常也被稱為build target,也就是構建的目標
- 在創(chuàng)建項目的時候默認就會創(chuàng)建一個target,有時被稱為主target
- 一個工程里可以創(chuàng)建多個target,每個target都對應相應的模板
- 一個包里可以有一個或多個target,也就是一個target列表。
- 一個target是一個app bundle 或 framework。每個target構建后對應一個庫或一個可執(zhí)行文件作為product。
- target之間存在依賴關系,可以在Xcode里定義某個target依賴哪些其它target
- Module:很多編程語言里一個文件對應一個module,但Swift不是。
- 模塊是代碼的集合,對應一個或多個文件,里面定義Swift的 類、函數(shù)等
- 一個模塊對應一個發(fā)布單元
- 一個module就可以看成是一個project中的一個target,這個target的默認模塊名稱就是這個項目的名稱(可以在target的Build Settings—Product Module Name配置)
- 在同一個模塊中所有的Swift類處于同一個命名空間,它們之間不需要導入就可以相互訪問
- namespace: 一個class或一個struct就定義一個namespace,或者說一個{}就對應一個namespace
- Swift有命名空間,而Objective-C沒有。
- Swift并沒有namespace這個關鍵字
- Bundle:Xcode 工程項目本身就是在一個 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與文件名和路徑無關,只與模塊名有關。這一點不同于Java和Python。在Xcode中,創(chuàng)建group和folder是有區(qū)別的,group參與編譯,創(chuàng)建group可以選擇不創(chuàng)建folder,folder下文件不參與編譯。folder是藍色的,它是以文件夾的形式存在;group是黃色的,它是以分組的概念存在。
Swift工程結構示例:
不管你是Run,還是Build,首先要明確你是針對哪個Schema。如下,你要選擇對應的Schema才行。
創(chuàng)建了兩個Target,其中一個是Unit Test,依賴主target。
Swift語法速記(TODO)
每一門編程語言都喜歡用不同的方式做和別人相同的事情。不知道這是故意標新立異,還是真的有某種道理,難道設計者不知道Java和C的語言風格已經成了大眾的習慣嗎?對于程序員來說只能選擇接受。例如定義函數(shù)的關鍵字就有def, func, function等,Swift也不例外,也搞了一套自己的語法糖。
- 常量用let,變量用var
- 函數(shù)參數(shù)有標簽,有名稱,返回類型用箭頭,傳參需帶參數(shù)名,要吐:-)
- 字符串可以用單引號或雙引號,多行字符串用三個單引號或三個雙引號
- 數(shù)組、Set、字典都是用中括號定義,都可以用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向上轉,as!向下轉。不確定向下轉型可以成功時,用類型轉換的條件形式(as?),只有你可以確定向下轉型一定會成功時,才使用強制形式(as!)
- ??左邊為nil的時候,取右邊
- 擴展: 擴展可以給一個現(xiàn)有的類,結構體,枚舉,還有協(xié)議添加新的功能。類似與Javascript的原型機制
- 協(xié)議:類似于Java的接口
- subscript:用來索引對象。下標可以定義在類、結構體和枚舉中,是訪問集合、列表或序列中元素的快捷方式。
- guard, if…else, if let用法的區(qū)別
- ForEach需要item符合 Identifiable協(xié)議,如 ForEach(items, id: .pageId){}
- mutating關鍵字
- any和some:any 吾不知其為何物也,some 吾知其為何物,但不知道其具體實例
小技巧
單元測試中使用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時連接github超時
由于Xcode不能直接設置代理,所以穩(wěn)妥方式是手工下載github代碼,再添加時選Local:
刷新幾把Xcode,有時需要關閉項目或關閉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無法修改快捷鍵,一閃而過
輸入法改成自帶的英文,不要用搜狗