版本記錄
版本號(hào) | 時(shí)間 |
---|---|
V1.0 | 2018.08.11 |
前言
很多時(shí)候我們可以用第三方庫炭晒,比如是SDWebImage或者一些視頻云播放器的框架或庫执庐,這些框架其實(shí)也是有人寫好了封裝起來的贰镣,不同的工程都可以直接拿來使用榴啸,以達(dá)到代碼分享孽惰、模塊化你的代碼以及將其作為第三方庫進(jìn)行發(fā)布。
必要說明
您是否曾想在兩個(gè)或多個(gè)應(yīng)用程序之間共享一大堆代碼鸥印,或者想與其他開發(fā)人員共享您的程序的一部分勋功?
也許您希望以類似于iOS SDK按功能分離其API的方式模塊化您的代碼。 或許您希望以與流行的第三方庫相同的方式發(fā)布您的代碼库说。
在本教程中狂鞋,您將學(xué)習(xí)如何使用Frameworks
完成上述所有操作!
框架有三個(gè)主要目的:
- 代碼封裝潜的。
- 代碼模塊化骚揍。
- 代碼重用。
您可以與其他應(yīng)用啰挪,團(tuán)隊(duì)成員或iOS社區(qū)共享您的框架信不。 當(dāng)與Swift的access control
結(jié)合使用時(shí),框架有助于在代碼模塊之間定義強(qiáng)大亡呵,可測(cè)試的接口抽活。
用Swift的說法,module
是一組編譯在一起發(fā)布的代碼政己。 框架是一種類型的模塊酌壕,而應(yīng)用程序是另一個(gè)示例。
在本教程中歇由,您將通過以下方式了解框架的細(xì)節(jié):
- 為旋鈕控件創(chuàng)建一個(gè)新框架卵牍。
- 遷移現(xiàn)有代碼。
- 將整個(gè)內(nèi)容導(dǎo)回到應(yīng)用程序中沦泌。
- 在Interface Builder中動(dòng)態(tài)渲染自定義組件糊昙。
- 將其打包成超便攜式CocoaPod。
-
Bonus
:為您的框架設(shè)置存儲(chǔ)庫谢谦。
當(dāng)你完成時(shí)释牺,應(yīng)用程序?qū)⑼耆褚郧耙粯舆\(yùn)行萝衩,但將使用你開發(fā)的可移植框架!
開始
在Xcode中打開啟動(dòng)已有的項(xiàng)目没咙。
KnobShowcase
是一個(gè)簡(jiǎn)單的應(yīng)用程序猩谊,它演示了如何與控件(如圓形滑塊)進(jìn)行交互,例如在調(diào)音臺(tái)上找到的控件祭刚。
構(gòu)建并運(yùn)行以了解其工作原理牌捷。
此控件的代碼位于兩個(gè)文件中:
-
Knob.swift
具有所有視圖邏輯。 -
ViewController.swift
負(fù)責(zé)創(chuàng)建旋鈕并與之交互涡驮。
這個(gè)旋鈕控制很有趣暗甥,但是在更多的應(yīng)用中使用到不是更好嗎?框架就可以幫你做到這一點(diǎn)捉捅。
Creating a Framework - 創(chuàng)建一個(gè)框架
框架是獨(dú)立的撤防,可重復(fù)使用的代碼和資源塊,您可以將其導(dǎo)入任意數(shù)量的應(yīng)用程序棒口,甚至可以在iOS寄月,tvOS,watchOS和macOS應(yīng)用程序之間共享陌凳。
如果您使用其他語言編程剥懒,您可能聽說過node modules
,packages
合敦,gems
或jars
初橘。 框架是這些的Xcode版本。 iOS SDK中常見框架的一些示例是Foundation
充岛,UIKit
保檐,AVFoundation
和CloudKit
。
注意:如果您想了解有關(guān)Frameworks的更多信息崔梗,請(qǐng)閱讀What are Frameworks?
1. Framework Set Up - 框架設(shè)置
在Xcode 6中夜只,Apple引入了Cocoa Touch Framework
模板以及access control
,因此創(chuàng)建框架從未變得如此簡(jiǎn)單蒜魄。 首先要做的是為框架創(chuàng)建項(xiàng)目扔亥。
- 1)在Xcode中,選擇
File ? New ? Project….
- 2)選擇
iOS ? Framework & Library ? Cocoa Touch Framework
- 3)點(diǎn)擊
Next
- 4)設(shè)置
Product Name
為KnobControl
谈为,使用你自己的Organization Name
和Organization Identifier
- 5)點(diǎn)擊
Next
- 6)在文件選擇器中旅挤,選擇在與
KnobShowcase
根文件夾相同的級(jí)別創(chuàng)建項(xiàng)目。
- 7)點(diǎn)擊
Create
現(xiàn)在你有一個(gè)創(chuàng)建框架的項(xiàng)目(盡管很無聊)伞鲫!
2. Add Code - 添加代碼
您當(dāng)前的狀態(tài)是沒有代碼的框架粘茄,這與沒有糖的巧克力一樣吸引人。 在本節(jié)中,您將通過將現(xiàn)有文件添加到框架來引入代碼柒瓣。
從KnobShowcase
源目錄中儒搭,將Knob.swift
文件拖到Xcode中的KnobControl
項(xiàng)目中。 如果需要芙贫,請(qǐng)務(wù)必選中Copy items if needed
搂鲫,以便將文件實(shí)際復(fù)制到新項(xiàng)目中,而不是僅添加引用屹培。 框架需要自己的代碼才能獨(dú)立默穴,而不是引用怔檩。
仔細(xì)檢查Knob.swift
在KnobControl
中是否具有Target Membership
褪秀,以確保它出現(xiàn)在最終框架中。 您可以在File inspector
中對(duì)此進(jìn)行驗(yàn)證薛训。
構(gòu)建框架項(xiàng)目以確保您在沒有構(gòu)建警告或錯(cuò)誤的情況下獲得Build Succeeded媒吗。
Knob.swift
中包含三個(gè)不同的類:
-
Knob
- 旋鈕:實(shí)際的自定義控件。 -
KnobRenderer
:一個(gè)私有類乙埃,用于跟蹤與渲染旋鈕本身相關(guān)的代碼闸英。 -
RotationGestureRecognizer
:一個(gè)私有類,可以與旋鈕進(jìn)行交互介袜。
您的下一個(gè)任務(wù)是將這些組件分成不同的文件甫何。 首先移動(dòng)KnobRenderer
:
- 1)轉(zhuǎn)到
File ? New ? File…
并選擇iOS ? Source ? Swift File
。 - 2)點(diǎn)擊
Next
遇伞。 - 3)在下一個(gè)屏幕截圖上辙喂,將類名指定為
KnobRenderer
,然后選擇KnobControl?KnobControl
目錄鸠珠。
- 4)點(diǎn)擊
Create
- 5)打開
Knob.swift
巍耗,剪切(Command-X
)整個(gè)KnobRenderer
類并將其粘貼(Command-V)
到import Foundation
語句正下方的KnobRenderer.swift
中。 - 6)刪除
KnobRenderer
的私有修飾符渐排。 當(dāng)代碼全部包含在Knob.swift
中時(shí)炬太,這很好,但現(xiàn)在必須可以使用默認(rèn)的internal
修飾符訪問整個(gè)模塊驯耻。
對(duì)RotationGestureRecognizer
類重復(fù)步驟1到6亲族。 在這種情況下,當(dāng)您執(zhí)行第五步時(shí)可缚,請(qǐng)確保您還獲取導(dǎo)入UIKit.UIGestureRecognizerSubclass
語句霎迫,否則編譯器將在構(gòu)建階段進(jìn)行complain
。
創(chuàng)建了兩個(gè)新文件后城看,Knob.swift
現(xiàn)在只包含Knob
類女气。
注意:將類分成它們自己的文件并不是絕對(duì)必要的,但為了使代碼組織起來测柠,這是一個(gè)很好的做法炼鞠。 您不希望擁有難以理解和維護(hù)的龐大文件缘滥。
Add the Framework to the Project - 將框架添加到項(xiàng)目
關(guān)閉KnobControl
項(xiàng)目,然后返回KnobShowcase
項(xiàng)目谒主。 刪除Knob.swift
文件朝扼。 在確認(rèn)對(duì)話框中選擇Move to Trash
。
Build項(xiàng)目霎肯,你會(huì)看到幾個(gè)可預(yù)測(cè)的錯(cuò)誤擎颖,其中包含了Xcode不知道什么是旋鈕。 好吧观游,你實(shí)際上會(huì)看到Use of undeclared type ‘Knob’
錯(cuò)誤消息搂捧。
添加KnobControl
框架項(xiàng)目是解決這些問題的方法。
Embed Your Binary - 嵌入你的二進(jìn)制
右鍵單擊項(xiàng)目導(dǎo)航器中的根KnobShowcase
節(jié)點(diǎn)懂缕。 單擊Add Files to “KnobShowcase”
允跑。 在文件選擇器中,導(dǎo)航到并選擇KnobControl.xcodeproj
搪柑。 單擊Add
以將KnobControl.xcodeproj
添加為子項(xiàng)目聋丝。
注意:將框架項(xiàng)目添加到app項(xiàng)目并不是絕對(duì)必要的。你可以添加
KnobControl.framework
輸出工碾。但是弱睦,組合這些項(xiàng)目可以更輕松地同時(shí)開發(fā)框架和應(yīng)用程序。 您對(duì)框架項(xiàng)目所做的任何更改都會(huì)自動(dòng)傳播到應(yīng)用程序渊额。 它還使Xcode更容易解析路徑并知道何時(shí)重建項(xiàng)目况木。
Build并運(yùn)行,您將看到相同的編譯錯(cuò)誤端圈!
即使這兩個(gè)項(xiàng)目現(xiàn)在在一起焦读,KnobShowcase
仍然沒有得到KnobControl
。 這就像他們坐在同一個(gè)房間舱权,但KnobShowcase
無法看到新的框架矗晃。
您將框架鏈接到應(yīng)用程序的目標(biāo)以解決此問題。 首先宴倍,展開KnobControl
項(xiàng)目以查看Products
文件夾张症,然后在其下面查找KnobControl.framework
。 此文件是框架項(xiàng)目的輸出鸵贬,用于打包二進(jìn)制代碼俗他,標(biāo)頭,資源和元數(shù)據(jù)阔逼。
選擇頂級(jí)KnobShowcase
節(jié)點(diǎn)以打開項(xiàng)目編輯器兆衅。 單擊KnobShowcase
目標(biāo),然后轉(zhuǎn)到General
選項(xiàng)卡。
向下滾動(dòng)到Embedded Binaries
部分羡亩。 將KnobControl.framework
從KnobControl.xcodeproj
的Products
文件夾拖到此部分摩疑。
您剛剛在Embedded Binaries
和Linked Frameworks and Binaries
中添加了框架條目。
現(xiàn)在應(yīng)用程序知道框架以及在哪里找到它畏铆,所以這應(yīng)該足夠了雷袋,對(duì)吧?
構(gòu)建KnobShowcase
項(xiàng)目辞居。 更多相同的錯(cuò)誤楷怒。
Access Control - 訪問獲取控制
你的問題是雖然框架是項(xiàng)目的一部分,但是項(xiàng)目的代碼并不知道它 - 看不見瓦灶。
轉(zhuǎn)到ViewController.swift
鸠删,并將以下行添加到文件頂部的導(dǎo)入列表中。
import KnobControl
這很關(guān)鍵倚搬,但是這種包含仍然無法解決構(gòu)建錯(cuò)誤冶共。 這是因?yàn)镾wift使用access control
來確定構(gòu)造是否對(duì)其他文件或模塊可見。
默認(rèn)情況下每界,Swift僅在其自己的模塊內(nèi)部使internal
或可見。
要恢復(fù)應(yīng)用程序的功能家卖,您必須更新Knob
類的訪問控制眨层。
雖然它有點(diǎn)單調(diào)乏味,但更新訪問控制的過程通過隱藏不應(yīng)出現(xiàn)在框架之外的代碼來提高模塊性上荡。 您可以通過將某些函數(shù)保留為無訪問修飾符趴樱,或通過明確聲明它們?yōu)?code>internal來實(shí)現(xiàn)此目的。
Swift有五個(gè)級(jí)別的訪問控制酪捡。 創(chuàng)建自己的框架時(shí)叁征,請(qǐng)遵循以下經(jīng)驗(yàn)法則:
- Open and public:用于應(yīng)用程序或其他框架調(diào)用的代碼,例如 自定義視圖逛薇。
- Internal:用于框架內(nèi)的函數(shù)和類之間使用的代碼捺疼,例如 該視圖中的自定義圖層。
- Fileprivate:用于單個(gè)文件中使用的代碼永罚,例如 一個(gè)幫助函數(shù)啤呼,用于計(jì)算布局高度。
- Private:用于封閉聲明中使用的代碼呢袱,例如單個(gè)類塊官扣,以及該聲明在同一文件中的擴(kuò)展。
當(dāng)Knob
成為Showcase
應(yīng)用程序的一部分時(shí)羞福,內(nèi)部訪問不是問題惕蹄。 現(xiàn)在它已經(jīng)在一個(gè)單獨(dú)的模塊中,必須將其公開以供應(yīng)用程序使用它。 你將在下一節(jié)中做到這一點(diǎn)卖陵。
注意:如果您想了解有關(guān)訪問控制內(nèi)部的更多信息并了解
open
和public
之間的區(qū)別恋昼,請(qǐng)查看 Access Control Documentation。
Update the Code - 更新代碼
在KnobShowcase
中打開Knob.swift
赶促。 通過將public
關(guān)鍵字添加到類定義來使類成為公共液肌,如下所示:
public class Knob : UIControl {
現(xiàn)在任何導(dǎo)入KnobControl
框架的應(yīng)用程序文件都可以看到Knob
。
現(xiàn)在將public
關(guān)鍵字添加到:
- 屬性
minimumValue鸥滨,maximumValue嗦哆,value,isContinuous婿滓,lineWidth老速, startAngle,endAngle凸主,pointerLength和color
橘券。 注意value
,該屬性將是public
的卿吐,而setter繼續(xù)是私有的旁舰。 - 兩個(gè)
init
函數(shù)。 - 方法
setValue(_:animated :)
和tintColorDidChange()
嗡官。
注意:您可能想知道為什么必須將
init
方法聲明為public
箭窜。 Apple在其訪問控制文檔中解釋了這個(gè)以及其他更精細(xì)的訪問控制點(diǎn)。
現(xiàn)在構(gòu)建并運(yùn)行衍腥。 好消息是錯(cuò)誤消失了磺樱,壞消息是你遇到了如下運(yùn)行時(shí)崩潰:
這是怎么回事? 下一篇會(huì)進(jìn)行介紹婆咸。
后記
本篇主要介紹了一個(gè)詳細(xì)的框架創(chuàng)建流程竹捉,感興趣的給個(gè)贊或者關(guān)注~~~