標籤:通過 imp 預設 elf 資料類型 tle now() c語言 簡潔
Swift 3.0 做出的改變很大,在這篇文章中,我將盡我所能,利用代碼範例給大家解釋Swift 3.0最重要(要命)的改變,希望大家能夠做好升級Swift 3.0 的準備。Swift 3.0的改變不僅僅是我下面的這個列表,但是列表中的每一項都是對你的一個巨大的打擊。
雖然Swift 3.0 仍處於開發階段。Swift 3.0 會有很多很多的變化,其中一些可能會在細微之處。然而,我們希望這些變化是一次性的。為了使Swift可以在未來幾年更好的發展,在以後的版本更新中改變應該的顯著變小。一些Swift 2.3的東西已經過時了,並且被刪除了。這包括++,--,C風格的for迴圈,元組文法等等。但不得不說3.0之後的swift變得更加簡潔。
- 關於Bool屬性:所有的BOOL類型都重新命名為isXXX,所以以後我們的自訂類中BOOL屬性的命名也應體現這個規則
2.3寫法:btn.hidden = false
3.0寫法:btn.isHidden = false
像UserDefaults、URL、NotificationCenter、Bundle、Timer、Thread、RunLoop等
Swift2.3中,使用構造方法和make函數都可以建立;
// Make函數建立 let size = CGSizeMake(10, 20)
// 構造方法建立 let _ = CGSize(width: 10, height: 20)
Swift3.0中,廢棄make函數,只能使用構造方法建立
// 只能使用構造方法建立let _ = CGSize(width: 10, height: 20)
Swift 3.0 中NSNotification和Notification建立時,通知的name參數類型都變為“Notification.Name”類型,該類型建立比較複雜。
// Swift3.0中的通知let _ = NSNotification(name: NSNotification.Name(rawValue: "name"), object: nil)
- UIViewController 返回是否顯示狀態列的方法變化
狀態列顯示由方法func變為var屬性
擷取檔案路徑統一交給FileManager來管理
順延強制的代碼轉換的不夠好。應該這樣寫:
// 順延強制代碼DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 5) { print("明明")}
Swfit的關鍵字的變化
private: 私人屬性和方法,僅在當前類中可以訪問,不包括分類;
fileprivate: 檔案內私人屬性和方法,僅在當前檔案中可以訪問,包括同一個檔案中不同的類。
// 只能在當前大括弧內訪問 private func privatePractise() { value = 1 fileprivatePractise() print("privatePractise方法被調用了") } // 只能在當前檔案內訪問 fileprivate func fileprivatePractise() { privatePractise() print("fileprivatePractise方法被調用了") }
在Swift2.3中,pubic有兩層含義:
這個元素可以在其他範圍被訪問
這個元素可以在其他範圍被繼承或者override
繼承是一件危險的事情。尤其對於一個framework或者module的設計者而言。在自身的module內,類或者屬性對於作者而言是清晰的,能否被繼承或者override都是可控的。但是對於使用它的人,作者有時會希望傳達出這個類或者屬性不應該被繼承或者修改。這個對應的就是 final。
final的問題在於在標記之後,在任何地方都不能override。而對於lib的設計者而言,希望得到的是在module內可以被override,在被import到其他地方後其他使用者使用的時候不能被override。
這就是 open產生的初衷。通過open和public標記區別一個元素在其他module中是只能被訪問還是可以被override。
在Swift3.0中
public表示當前類、屬性或者方法只能在當前module內被繼承或者override,在當前module意外只能被訪問;
open表示當前類、屬性或者方法可以在任何地方被繼承或者override;
final是一個輔助修飾詞,表示當前類、屬性或者方法在任何地方都只能被訪問,不能被繼承或者override;
internal表示預設層級。
Swfit3.0中,存取控制許可權由高到低依次為:open、public、internal(預設)、fileprivate,private。
在Swift2.3中
// Swift2.3var value: Int?var num: Int?if let v = value, n = num where v > n { print("value > num")}value = 1num = 2guard let v = value, n = num where v > n else { print("value < num") return}
在Swift3.0中
// Swift3.0var value: Int?var num: Int?if let v = value, let n = num, v > n { print("value > num")}value = 1num = 2guard let v = value, let n = num, v > n else { print("value < num") return}
在Swift的方法命名規則中,參數有兩個名稱,一個內部名,一個外部名。當參數有外部名時,方法調用時只顯示外部名,若無外部名,則預設外部名和內部名相同。建議以後自訂方法時,風格盡量和Swift3.0保持一致。
在Swift3.0 編譯器環境下兩種風格對比:
在Swift2.2中,當我們為一個按鈕添加點擊事件時常常這樣寫:
btn.addTarget(self, action:"click", forControlEvents: .TouchUpInside)
在Swift3.0中兩種寫法依然都可以使用,但建議寫成下面格式:
btn.addTarget(self, action:#selector(ViewController.click), for: .touchUpInside)
- Swift3.0中運算子的左右兩邊必須不能為optional
- ++和--是繼承自C語言中的運算子,在Swift3.0中被移除,建議使用 += 1/ -= 1來代替
對於枚舉和屬性,駝峰大寫首碼被替換成了駝峰小寫首碼
比如說CGColor或CIColor。是的,現在它將會變成cgColor和ciColor。
let red = UIColor.red().cgColor
這種變化確實提高了編碼的一致性:所有的屬性和參數應該都是以小寫開始,沒有例外!
同時,枚舉也在發生著改變,從駝峰大寫首碼改為駝峰小寫首碼。這意味著:枚舉是一個資料類型,但是枚舉值更接近屬性。然而,這意味著蘋果的枚舉現在都是小寫了。
NSTextAlignment.Left// old
NSTextAlignment.left// new
swift3.0變化總結