?? minimap 顯示所有信息列表
Xcode 在 11 中引入了 minimap 功能,這個超實(shí)用的功能可以說是現(xiàn)代 IDE 的標(biāo)配,向我們展示了代碼的全景,可以讓我們更好地瀏覽代碼。如果仔細(xì)觀察,會發(fā)現(xiàn) minimap 中的配色和語法高亮與編輯區(qū)的是一樣的。代碼中的變更(Git)、斷點(diǎn)、甚至是當(dāng)前光標(biāo)位置也是一樣的。我們可以在 minimap 中概覽代碼中的所有信息。
當(dāng)我們將鼠標(biāo)懸停在 minimap 上,移動鼠標(biāo)時,可以發(fā)現(xiàn)鼠標(biāo)當(dāng)前位置的屬性、函數(shù)、類會顯示在 minimap 的左側(cè)。單擊懸停位置時,編輯區(qū)會移動至該位置對應(yīng)的代碼,這可以方便我們快速瀏覽代碼。
當(dāng)鼠標(biāo)懸停在 minimap 上時,按住 command 鍵會顯示當(dāng)前文件所有的類、函數(shù)、屬性、類型等信息的一個列表,這個列表還包含了 // MARK: 的信息。這時可以點(diǎn)擊任意一個列表項(xiàng),以跳轉(zhuǎn)到代碼對應(yīng)的部分。
image.png
?? 將代碼提取到方法或變量
我們可以選中部分代碼,然后通過右鍵點(diǎn)擊彈出菜單,選擇 Refactor -> Extract to Method 將它們提取成一個獨(dú)立的方法。提取出來后,給方法命個名就行。
而如果你有多個彼此鄰近且相似的表達(dá)式,而表達(dá)式本身的代碼比較多,比如說 UserDefault.default.*** 時,這時就可以考慮將這些相同或相似的表達(dá)式單獨(dú)提取到一個變量中,以簡化我們的代碼。具體操作是選中其中一個表達(dá)式中想提取的部分,然后點(diǎn)擊右鍵彈出菜單,選擇 Refactor -> Extract All Occurrences ,然后給表達(dá)式的變量命名,所有對應(yīng)的部分都用同步修改成這個變量名。
如果想提取單個表達(dá)式,則可以選擇 Refactor -> Extract to Variable 。
??多行/多光標(biāo)編輯
Xcode 10
通過快捷鍵 Shift + Ctrl + 鼠標(biāo)左鍵單擊,可以在你需要的地方創(chuàng)建一個光標(biāo),每操作一次就會新創(chuàng)建一個光標(biāo)。當(dāng)然,你也可以通過 Shift + Ctrl + 移動鼠標(biāo) 來每次選中一些字符,如下所示。在設(shè)置好多個光標(biāo)之后,就可以進(jìn)行多行編輯了。我們在此處將 var 統(tǒng)一修改成 let。
在操作完成后,可以按下 esc 鍵來退出多行編輯。
另外下面幾個快捷鍵也可創(chuàng)建多個光標(biāo)
? Shift+Ctrl+上移鍵
? Shift+Ctrl+下移鍵
? option+鼠標(biāo)拖動
有趣的是,如果兩次拖動選中的部分有重疊或相連時,只會為后一個拖動選中創(chuàng)建光標(biāo),而前一個則會被覆蓋。
??無線調(diào)試
無需將設(shè)備通過 USB 線連接到 Mac 上,可以選擇在本地網(wǎng)絡(luò)上的任何 iOS 或 tvOS 設(shè)備來安裝、運(yùn)行和調(diào)試應(yīng)用程序。首次使用一個新的 iOS 設(shè)備時,只需要點(diǎn)擊 "Connect via Network" 復(fù)選框,此后這臺設(shè)備即可通過網(wǎng)絡(luò)來調(diào)試。無線開發(fā)也可以用于其它應(yīng)用程序,包括 Instruments、Accessibility Inspector、 Quicktime Player 和 Console。
? Xcode 9 版本以上
? iPhone 和 Mac 連接同一個 wifi
? 至少 iOS 11 的系統(tǒng)
1、如果是第一次無線連接 iPhone,則需要先通過 USB 連接 Mac,然后在 Xcode 中打開 Device 界面
2、在信息面板中選中 Connect via network
3、拔掉數(shù)據(jù)線,在左側(cè)如果看到一個網(wǎng)絡(luò)的標(biāo)志,則代表連接成功
4、這時候,點(diǎn)開設(shè)備列表,可以看到真機(jī)還在,并且右側(cè)有一個小球
5、如果 iPhone 和 Mac 不在同一個 wifi 下,可以稍微麻煩點(diǎn),需要使用 IP 連接
image.png
image.png
??使用 "Refactor->Rename" 或 "Edit All in Scope" 重命名
假使我們想將 ContentView 改成 RootView,那么可以在結(jié)構(gòu)體的定義中右鍵單擊 ContentView,然后選中 Refactor-> Rename...,此時 Xcode 會列出工程范圍內(nèi)所有的引用了 ContentView 的代碼,其中包括文件名。
我們可以將結(jié)構(gòu)體名修改為 RootView,相應(yīng)的地方也會同步修改。如果某個文件中的 ContentView 和我們要修改的名稱并不相關(guān)而不需要修改,則可以取消這個文件的勾選狀態(tài)。
修改完成后點(diǎn)擊右上角的 Rename 按鈕即可完成操作。
如果我們只想在單個文件中修改某個名字,則可以使用 Edit all in scope 功能。在文件中選中某個變量,然后使用快捷鍵 CMD + Click,在彈出的菜單中選擇 Edit All in Scope ,然后修改即可。
??自定義 Xcode 模板
Xcode 模板是用來創(chuàng)建代碼片段的工具。當(dāng)你的工程中有很多可以標(biāo)準(zhǔn)化的代碼時,比如 MVVM 架構(gòu)中的各個組件,使用模板可以快速幫你生成代碼,避免手動去新建 MVVM 每個組件的文件,然后再手動敲每個組件的通用代碼。而且模板可以集成進(jìn) Xcode 的 新建文件 面板中,以我們熟悉的方式來創(chuàng)建。實(shí)際上面板中的項(xiàng)目都是現(xiàn)成的模板。
Xcode 所有的自定義的模板文件都放在 ~/Library/Developer/Xcode/Templates/ 中,可以按自己的需要在這個目錄中創(chuàng)建一些子文件夾,這些子目錄會以分組的形式出現(xiàn)在 新建文件 面板中,每個子文件夾可以定義多個模板。我們在這創(chuàng)建一個 Custom Templates 子目錄。
每個 Xcode 文件模板都是以 .xctemplate 為擴(kuò)展名的獨(dú)立的文件夾。我們可以創(chuàng)建一個 MVVM.xctemplate 文件夾。然后在文件夾中新建一個 TemplateInfo.plist 文件來描述模板。這是個 XML 文件,如下所示:
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict> <key>Kind</key> <string>Xcode.IDEKit.TextSubstitutionFileTemplateKind</string> <key>Platforms</key> <array> <string>com.apple.platform.iphoneos</string> </array> <key>Options</key> <array> <dict> <key>Identifier</key> <string>productName</string> <key>Required</key> <true/> <key>Name</key><string>Module Name</string> <key>Description</key> <string>MVVM</string> <key>Type</key> <string>text</string> <key>Default</key> <string>MVVM Template</string> </dict> </array></dict></plist>
在這個配置文件中,需要注意一個值 Identifier,即創(chuàng)建文件時輸入的一個標(biāo)識,我們會在后續(xù)的文件或文件夾中,以 __VARIABLE_productName__ 作為變量值來替換所有引用到這個值的地方,包括文件夾名稱、文件名稱、和文件中的類名和變量名等。
實(shí)際上這時我們就可以在新建文件面板中看到一個 Icon 了。
不過我們還需要補(bǔ)全代碼。
我們簡單地以 視圖控制器和 ViewModel 為例。我們在 MVVM.xctemplate 下添加一個文件夾,命名為 __VARIABLE_productName__,同時在這個子文件夾下分別新建文件 __VARIABLE_productName__ViewController.swift和 __VARIABLE_productName__ViewModel.swift,內(nèi)容分別如下:
// __VARIABLE_productName__ViewController.swiftimport UIKitclass ___VARIABLE_productName___Controller: UIViewController { let viewModel: ___VARIABLE_productName___ViewModel let mainView: ___VARIABLE_productName___View init() { viewModel = ___VARIABLE_productName___ViewModel(withModel: ___VARIABLE_productName___()) mainView = ___VARIABLE_productName___View() super.init(nibName: nil, bundle: nil) mainView.configure(withViewModel: viewModel) } required init?(coder _: NSCoder) { fatalError("init(coder:) has not been implemented") } override func viewDidLoad() { super.viewDidLoad() }}
// __VARIABLE_productName__ViewModel.swiftimport UIKitclass ___VARIABLE_productName___ViewModel { private let model: __VARIABLE_productName: identifier__ init(withModel model: __VARIABLE_productName: identifier__) { self.model = model }}
這時我們便可以在新建文件面板中通過我們的自定義模板來創(chuàng)建文件了,如下圖。
當(dāng)然這里只是一個簡單的示例,還有一些地方需要完善,比如說自定義新建文件面板中的圖標(biāo),以 Group 的形式新增文件夾等等,讀者可以自行探索。
??將警告當(dāng)成錯誤來顯示
在 Xcode 中編輯代碼時,總會因?yàn)橐恍┰?,讓編譯器報一些錯誤或者是警告。通常對于編譯錯誤,我們需要修改以讓程序順序跑起來,而對于警告,很多程序員可能覺得無所謂,只要不影響正常運(yùn)行,不改也是可以的。而老炮們都知道,這些編譯器警告也可能會影響到程序的正常運(yùn)行。所以,我們也應(yīng)該重視這些警告,最好是把警告的問題也全部修正。
實(shí)際上,Xcode 提供了一個很有用的 build 選項(xiàng), Treat Warnings as Errors ,將這個選項(xiàng)設(shè)置為 YES ,則編譯器會將警告也當(dāng)成錯誤來處理,這樣可以強(qiáng)制你去修改這些問題。
我們可以在 Build Settings 中來設(shè)置這個選項(xiàng)。Objective-C 和 Swift 項(xiàng)目稍微有點(diǎn)不同。對于 Objective-C 項(xiàng)目,可以在 Apple LLVM - Warning Policies 中設(shè)置:
對于 Swift 項(xiàng)目,還可以在 Swift Compiler - Warning Policies 中設(shè)置:
這樣,在編譯時,就會將警告當(dāng)成錯誤來顯示,如下圖:
當(dāng)然,這有一個需要權(quán)衡的問題。一方面我們需要開發(fā)效率,一方面需要保證正確。這種將警告處理成錯誤勢必會影響開發(fā)速度。所以建議以下配置:在 Debug 階段忽略,在 Release 階段再統(tǒng)一處理


