作者自己說自己很喜歡swift,因為他喜歡haskell。可能看上了swift支援函式式程式設計的緣故。
中間扯皮各種略。。。
扯到函式程式設計剛開始不習慣但是會帶來方便。。略結束。。。
ex by oc:
- (nsattributedstring *)attributedstring:(nsstring *)input
看上去無公害,但是引數如果是nil,那邊會導致崩潰。而且更坑爹是在執行時才會發現這個問題。這種問題一旦是你的下游程式猿(使用者)去接手的時候,找這個bug就不是很好找了咯。
對比swift寫法:
extension nsattributedstring
如果可以傳入乙個nil值得引數,那麼介面會變成這樣:
extension nsattributedstring
這種寫法的優勢在於更強的解釋性,也省去了看文件的時間。更不會導致執行時錯誤。
盡量避免無用選項關鍵字。用選項關鍵字是確實需要才使用的,比如你的引數是顏色,顏色需要符合某種要求。如果此時你的引數不滿足這種要求那麼你希望返回nil:
func parsecolorfromhexstring(input: string) -> uicolor?
列舉是swift得新特性,與oc的列舉有顯著的不同。oc中的列舉說白了就是整型。
讓我們考慮下布林型別。我們只需要考慮真或假。
在選項關鍵字也是這樣的原理,也只有兩種情況:有值跟nil.swift中選項與布林同樣都用列舉定義。不同的是選項列舉是帶繫結值得。我們來看下各自的定義:
enum boolean
enum optional
二選一枚舉經常在函式式程式設計中用於你在兩件事物中進行選擇的場景。舉個栗子,如果你想返回乙個整型或者錯誤,你可以使用either
。如果你要存乙個布林或者字串的字典,你可以使用either作為key值。
清楚的知道什麼時候該用列舉什麼時候不該用列舉有一點難度,當我們為一組相近型別得資料建立結構的時候。栗子,如果我們用swift來封裝github的介面,我們需要把各種暴露出的介面用列舉型來表示。為了獲得使用者頭像,我們提供使用者名稱。獲取使用者版本庫我們提供了使用者名稱跟,排序布林值。
enum github
定義開發性介面使用列舉真是棒極了。介面列表是受限的,我們可以定義各類介面。如果遺漏了某個列舉值我們會接受到乙個告警。如果我們擅自新增了一類情況,我們需要更新所有用到該類列舉型別得**。
其他使用列舉的時候不能隨意新增case,除非有**許可權。這是乙個非常好的限制。假想下你可以新增乙個情形到bool或者optional,那麼你所有用來它得方程都得重寫。
讓我們拿貨幣轉換器做個栗子:
enum currency
這樣我們可以根據貨幣字串來獲取貨幣符號:
func symbol(input: currency) -> string
}func format(amount: double, currency: currency) -> string
在swift不能簡單去繼承父類來擴充套件列舉型別。需要通過用協議來實現列舉的擴充套件。
protocol currencysymbol
現在,我們可以讓currency
成為協議的乙個例項,現在我們可以將input引數剔除,因為預設傳入self
:
extension currency : currencysymbol
}}
重寫format
:
func format(amount: double, currency: currencysymbol) -> string
現在我們可以通過讓各種各樣的資料型別來遵循這個協議的方式讓我們的**具有靈活的擴充套件性,比如現在有位元幣型別:
struct bitcoin : currencysymbol
}
現在通過協議而並非具體類的方式來應對各種資料型別引數值得方式可以使我們的**更易於擴充套件。你可以使用便利的擴充套件搭配使用協議,你的**將更具語言表達力!請根據你的實際情況決定你的忌口是開放還是封閉!
swift還有乙個優勢在於它的型別(資料)安全,正如前面說到的optionals
。我們可以將型別檢查從執行時提到編譯時通過一些技巧。舉個陣列的栗子,陣列是泛型的,它可以容納同一型別的元素。不可以在字串陣列內新增整型。(當然你可以通過either
來弄出乙個混合陣列。。 - -||)
又假設我們要將currency converter
變成乙個通用的轉換器。如果我們用double
來表示總數,這樣會導致一定的混淆。舉個栗子,100.0可能意味著100美元,100千克,或者其他代表100的東東。我們要做的是讓型別系統來為我們根據物理量建立出相對應得資料型別。舉個栗子,我們可以定義這樣的乙個型別來描述貨幣:
struct money
同樣,我們可以定義質量的資料結構:
struct mass
這樣可以增加**的可讀性,假設我們有如下重量方程的介面:
func pounds(input: double) -> double
這樣顯然太晦澀了,我們可以這麼寫:
func pounds(input: mass) -> double
這樣寫的好處有二,其一是**解釋性強了,第二編譯器會幫我們進行型別檢查。
另乙個swift支援的特性是內建支援值不可變。在cocoa框架裡面有很多api的引數設定為不可變額。還有成雙出現得一些類表達可變不可變(nsstring vs. nsmutablestring, nsarray vs. nsmutablearray)。在swift中就簡單明瞭多了:
var修飾的變數可變而let修飾的變數不可變。好處是介面更具有表達性以及涉及多執行緒操作更為容易。
令作者倍感欣慰的是編譯器做了原來我們讀文件需要的活兒。然後也**了下未來。。。略。。
D 鋒芒不露
題目鏈結 大概的意思就是2個陣列,元素兩兩組合,求組合最小的最大值。最大值最小 可以初步猜想,這樣的最大值最小一定出現在a公升序與b降序的兩兩對應中。驗證 a公升序,b降序。找到一組最大值,假設這一組不是最小的最大值,那麼要麼a與其他值換,要麼b與其他值換,無論怎麼樣,最大值都會增大。開始用set ...
巧用執行緒避鋒芒
嘿嘿,大量執行緒執行任務,可以使任務速度加快,可能是執行執行緒的主要原因?本人初學,感覺如此。不過近日在反思中想到,在windows窗體程式設計中,執行緒的別種功效 可以使具有大運算量的程序易於控制。比如帶有死迴圈的方法通常使窗體及其控制項處於不可用狀態,怎麼辦呢?此時就應該使用新執行緒來運算死迴圈...
2007 自由軟體,鋒芒初露
今年,6月 29日,新版本 gpl授權書 v3 的正式頒布,使得微軟整個地 激動 起來 worked up 9 月18日,歐盟對微軟壟斷市場的最終裁決,進一步確立了自由軟體正當 valid 的市場地位。12月 21日,微軟執行歐盟裁決,與自由軟體組織簽定協議,公開了自己的技術機密 協議文件 隨之,世...