【iOS開發】初識函式式Swift實用
Swift 的語言特性使得它非常適合被用於以函數語言程式設計思想,如果你還沒開始用函式式的方式來使用它,那麼可以從現在開始,嘗試著利用函式式的便利性。
let indicateView = UIImageView(frame: view.frame)
indicateView.image = UIImage(named: "how2use")
self.view.addSubview(indicateView)
我剛剛寫了上面這段程式碼,來讓我的當前頁面顯示名為 “how2use” 的這張圖片。看起來好像是我做了三件事:
- 根據 frame 建立 UIImageView
- 根據圖片名稱配置 UIImageView
- 將 UIImageView 作為 subview 傳給其他 view
但是實際上,我只需要 frame、imageName 這兩個東西就可以把這三行程式碼配置好,或者說我能不能用這兩個引數來把上面的三行程式碼縮減為一行。
extension UIImageView {
func frameSelf (rect:CGRect) -> UIImageView {
self.frame = rect
return self
}
func imageSelf (imageName:String) -> UIImageView {
self.image = UIImage(named: imageName)
return self
}
func placeSelf (view:UIView) -> UIImageView {
view.addSubview(self)
return self
}
}
寫了上面這些方法之後,程式碼修改成這個樣子了:
let indicateView = UIImageView()
.frameSelf(view.frame)
.imageSelf("how2use")
.placeSelf(self.view)
為了程式碼可讀性,這裡我寫了四行,但顯然這是一行程式碼。
繼而我發現 indicateView 這個名字沒有存在的必要,於是我廢棄掉 placeSelf 這個方法,改成這樣:
self.view.addSubview(UIImageView()
.frameSelf(view.frame)
.imageSelf("how2use"))
一行程式碼,不引入多餘的變數。
如果你願意的話,這個模式還可以繼續寫下去。
extension UIImageView {
func tagSelf (tag:Int) -> UIImageView {
self.tag = tag
return self
}
func modeSelf(contentMode:UIViewContentMode) -> UIImageView {
self.contentMode = contentMode
return self
}
}
最後程式碼會變成這種形式:
NSObject().func1().func2().func3()......
思考
- 上面這些程式碼的優勢在於:類似 indicateView 這種東西,用一次就不要了,沒必要引入新的名稱,不便於理解和記憶,我們就可以函式式地把它解決掉,程式碼更精簡易讀。
- 上面我用了 xxxxSelf 這種方式來表明,這種方法不是用一下就完了,它會返回這個物件本身,所以你還可以繼續做別的事情。但是這種命名方式我個人看來不夠好,唯一好的地方可能只是在於:本來我想設定 imageView.tag = 100,結果敲出 tag 這三個字母,Xcode 就提示我有 tagSelf 這個方法可以用,這可以讓我方便地自動補全這個方法,不需要記憶方法名。
- 這種程式設計方式的優點之一在於不同方法之間的組合性,如果你想把上面這些方法整合到一個函式裡,然後通過傳一大堆的引數來進行呼叫,是畫蛇添足。
- 顯然這種方式有其弊端,不宜濫用,而且修改程式碼的時候要注意:假如你要改動 func2,注意它和 func1、func3 之間是不是存在什麼先後關係。特別是你用這種方式來給圖片做濾鏡處理的時候,一張圖片先高斯模糊再打馬賽克,先打馬賽克再高斯模糊是完全不同的。
userImage.blur().mosaic() // 馬賽克本身是清晰的
userImage.mosaic().blur() // 馬賽克本身是模糊的
推薦一下個人部落格:kyxu.tech
相關文章
- 初識函式函式
- 初識vLookup函式函式
- 09 初識函式函式
- iOS開發常用函式iOS函式
- 【函式式 Swift】函式式思想函式Swift
- day-09-初識函式函式
- 1.5.1 Python函式初識Python函式
- 【函式式 Swift】QuickCheck函式SwiftUI
- 初識用.NET Remoting來開發分散式應用(轉)REM分散式
- Swift,函式Swift函式
- swift 函式Swift函式
- 08-Python之路---初識函式Python函式
- [JavaScript基礎] 函式,初識作用域JavaScript函式
- 【函式式 Swift】可選值函式Swift
- swift 函式傳遞Swift函式
- Swift 函式提前返回Swift函式
- Swift-函式(Functions)Swift函式Function
- 淺談Swift中的函式式Swift函式
- 第三章 初識vLookup函式函式
- 函式計算-HelloWorld應用開發函式
- Presto 函式開發REST函式
- JS開發中函式知識點梳理(二)JS函式
- 摩登567主管-641480-js函式初識JS函式
- 用Swift和SpriteKit開發iOS遊戲SwiftiOS遊戲
- Swift實現多執行緒map函式Swift執行緒函式
- 實用函式式 Java (PFJ)簡介函式Java
- iOS開發資料庫篇—SQLite常用的函式iOS資料庫SQLite函式
- iOS學習筆記42 Swift(二)函式和閉包iOS筆記Swift函式
- iOS的鏈式開發iOS
- 開發hive UDF函式Hive函式
- Swift3.0 -- 建構函式Swift函式
- 【知識點】inline函式、回撥函式、普通函式inline函式
- (函式)實現strstr函式函式
- 小程式開發中雲函式的應用!函式
- swift1.2語言函式和閉包函式介紹Swift函式
- 損失函式+啟用函式函式
- python基礎知識之函式初階——閉包Python函式
- iOS-GCD常用函式和柵欄函式iOSGC函式