你好,歡迎來到IOS教程網

 Ios教程網 >> IOS訊息 >> 關於IOS >> Xcode 7 beta發布,Swift 2.0帶來哪些新變化?

Xcode 7 beta發布,Swift 2.0帶來哪些新變化?

編輯:關於IOS

WWDC 2015首日,蘋果發布了版本號為7A120f的Xcode 7 beta,包含了Xcode IDE、Swift 2編譯器、Instruments、模擬器和最新的OS X、iOS、watchOS SDK。
從Xcode 7 beta Release Notes可以看出,Swift 2.0包含了許多非常niubility的特性,現在,在Swift中支持錯誤處理,如拋出(throw)、捕獲(catch)、管理(manage)等,並且可以和NSError無縫交互。而當新的API需要向後兼容舊的系統版本時,如果當前API和將要部署的目標系統版本不一致,將會拋出一個編譯時錯誤。而近來在TIOBE編程語言排行榜呈現“自由落體”趨勢的Objective-C也有著兩處修改。具體更新如下:
Swift 2.0和Objective-C的更新

錯誤處理:我們可以在Swift中構建一個函數用來拋出,捕獲和管理錯誤。我們可以接觸和處理可恢復的錯誤,如“file-not-found”或者網絡超時,Swift和錯誤處理可以和NSError無縫交互。
可用性檢查:如果你在一個舊的部署平台上調用的一個新的系統版本引入的API時將觸發一個編譯時錯誤。我們可以在if或者guard條件語句中使用#available()函數來檢查API函數的可用性:例如:
[cpp] view plaincopy
if #available(iOS 8.0, OSX 10.10, *) {
// 當版本匹配時使用Handoff APIs.
let activity =
NSUserActivity(activityType:"com.example.ShoppingList.view")
activity.becomeCurrent()
} else {
//當版本不匹配時返回.
}
你可以在你的代碼聲明中使用@available()屬性聲明來指定可用性信息。 例如:
[cpp] view plaincopy
@available(iOS 8.0, OSX 10.10, *)
func startUserActivity() -> NSUserActivity {
...
}
指示startUserActivity()方法只在iOS8.0+,OSX10.10+以及以其他平台的全版本可用。

協議的擴展性:現在可以為協議類型編寫擴展,這樣就可以為遵循該協議的任意類增加方法或者屬性,極大重用我們的代碼。
協議默認實現:現在可以為協議擴展中指定的需求提供一個默認實現,這樣便可以使用諸如“mixin”和“trait”的模式。
新的defer語句:這個語句在代碼生命周期結束時用來做清理的工作,該特性在並發開發時使用新的錯誤處理模型時非常有用。例如:
[cpp] view plaincopy
let f = fopen("x.txt", "r")
defer { fclose(f) }
try foo(f) // f會關閉如果錯誤產生的話.
let f2 = fopen("y.txt", "r")
defer { fclose(f2) }
try bar(f, f2) // 如果錯誤產生f2關閉,接著f關閉。
} // f2關閉, 如果沒有任何錯誤產生f關閉。
新的guard語法:這個新的語法允許你在一個代碼周期中構建一個提前的退出點。例如:
[cpp] view plaincopy
guard let z = bar() else { return }
這裡的else語句被用於退出代碼塊(和return、throw、break、continue等類似),或者終止調用一個@noreturn屬性修飾的函數。
增強化的模式匹配:switch/case的模式匹配現在在很多新的條件流程控制語句中可用,這包括if/case,while/case,guard/case和for-in/case、for/in,同時也允許使用“where”判斷。
新的do語句:在do語句中支持代碼塊嵌套,例如:
[cpp] view plaincopy
do {
//new scope
do {
//another scope
}
}
可測試性:關於Swift2.0框架和App的測試現在不需要將內部功能代碼路由到public代碼了。在待測試代碼中使用@testable import {ModuleName}語法使所有的內部私有和public出來的代碼可用。App或者framework的target在編譯時需要啟用“Enable Testability”編譯設置。這個“Enable Testability”編譯屬性只能在Debug配置中可用,因為它需要導出內部符號信息從而妨礙代碼優化。
對C函數指針的支持:以函數指針作為函數參數的C函數將會使用閉包或者全局的函數的方式調用,由於這個限制,所以閉包不能捕獲其上下文環境。例如,標准C庫函數qsort將會按照如下方式調用:
[cpp] view plaincopy
var array = [3, 14, 15, 9, 2, 6, 5]
qsort(&array, array.count, sizeofValue(array[0])) { a, b in
return Int32(UnsafePointer<Int>(a).memory - UnsafePointer<Int>(b).memory)
}
print(array)
增強的診斷信息:增加了一個新的警告信息用來在盡可能的情況下鼓勵使用let而不是var。同時也增加了新的警告信息來提示未使用的變量,無法觸發的switch case分支判斷等,同時對於switch語句耗盡的判斷更加智能。
SIMD支持:Clang中擴展的矩陣算法在swift中可以導入並使用了,大數據量的圖形算法或者其他系統級別的數據運算在Swift實現成為可能。
枚舉中現在支持多泛型關聯值,例如:
[cpp] view plaincopy
enum Either<T, U> {
case Left(T), Right(U)
}
打印特定枚舉類型值時現在可以顯示枚舉值和附帶的值了,但是這個對於@objc類型的枚舉類型或者含有多附帶值的枚舉類型不支持。
現在允許對泛型類型編寫公共擴展(Public)了。例如:
[cpp] view plaincopy
public extension Array { … }
非泛型的類可以繼承自泛型的類了。
Swift字符串字面量的拼接,包括跨行文本,現在確保能夠進行編譯時優化。
可失敗便捷構造器現在允許在調用self.init前調用return nil語句。指定構造器在返回nil之前必須初始化所有的存儲屬性,這是一個已知的限制。
內嵌函數現在可以遞歸引用函數本身或者其他的內嵌函數。
if條件語句現在支持標簽化了,可以使用break去跳出一個標簽化的if判斷。注意不帶標簽的break語句只能使用在循環或者switch/case語句中而不能用在if中。
一個新的x?語句用來匹配可選類型。
一個新的@nonobjc屬性用來選擇性的禁止實例的導出,這個和@objc相對應。
在標准庫中增加了一個新的函數:readLine()
Playground

富文本注釋:采用Markdown樣式的語法來解釋代碼的功能。
內聯結果:在代碼的下方直接顯示代碼的輸出的結果。
資源:允許使用項目導航器面板向Playground中增加諸如圖片一樣的資源。
輔助代碼:在Playground本身之外保留額外的代碼用作輔助功能。
分頁:采用Bundle類似的方式來組織Playground結構。
詳解Swift語言的改變

OS X 10.11、iOS 9和watchOS 2 SDK采納了一些Objective-C的特性用來提高Swift的編程體驗,如可空性、類型化集合和一些別的特性。
標准庫中重構了很多泛型的全局函數(如map、filter和sort),采用協議擴展方式增加這些方法。這個好處是對於其他的關聯類型能很好的適配。
方法和函數現在使用同樣的參數命名規則了,我們可以用“_”符號來省略一個外部的參數名,為了簡化使用,用來指定參數名的簡化符號“#”被移除,因為Swift為默認參數提供了特殊的規則:
聲明:

[cpp] view plaincopy
func printFunction(str: String, newline: Bool)
func printMethod(str: String, newline: Bool)
func printFunctionOmitParameterName(str: String, _ newline: Bool)
調用:

[cpp] view plaincopy
printFunction(“hello”, newline: true)
printMethod(“hello”, newline: true)
printFunctionOmitParameterName("hello", true)
NS_OPTIONS類型現在遵循OptionSetType協議,這樣可以避免set樣式的接口調用:
避免采用如下位運算的調用方式:

[cpp] view plaincopy
// Swift 1.2:
object.invokeMethodWithOptions(.OptionA | .OptionB)
object.invokeMethodWithOptions(nil)
if options & .OptionC == .OptionC {
// .OptionC被設置
}
選項設置支持字面量語法和set樣式的調用,如contains:

[cpp] view plaincopy
object.invokeMethodWithOptions([.OptionA, .OptionB])
object.invokeMethodWithOptions([])
if options.contains(.OptionC) {
// .OptionC is set
}
在Swift中一個新的Option設置類型可以采用結構體遵循OptionSetType協議的方式編寫。如果該類型中指定了一個rawValue屬性和static let的常量定義,那麼標准庫將會為其他選項提供默認實現:

[cpp] view plaincopy
struct MyOptions: OptionSetType {
let rawValue: Int
static let TuringMachine = MyOptions(rawValue: 1)
static let LambdaCalculus = MyOptions(rawValue: 2)
static let VonNeumann = MyOptions(rawValue: 4)
}
let churchTuring: MyOptions = [.TuringMachine, .LambdaCalculus]
do/while循環被重名為repeat/while,這樣更加顯而易見:
Swift 1.2:

[cpp] view plaincopy
do {
...
} while <condition>
Swift 2.0:

[cpp] view plaincopy
repeat {
...
} while <condition>
println和print被合並成一個print函數,並帶有一個默認的參數:
Swift 1.2:

[cpp] view plaincopy
func print(<stuff to print>)
func println(<stuff to print>)
Swift 2.0:

[cpp] view plaincopy
func print(<stuff to print>, appendNewline: Bool = true)
Swift的文檔注釋現在基於Markdown語法。
參數縱覽語法:

[cpp] view plaincopy
- Parameters:
- x: ...
- y: ...
單獨參數語法:

[cpp] view plaincopy
- parameter x: ...
- parameter y: ..
返回值:

[cpp] view plaincopy
- returns: ...
其他需要在QuickHelp中高亮的語法字段,可以參考Markdown語法。

CFunctionPointer<T -> U> 類型被移除,C函數現在使用新的@convention(c)屬性聲明,和其他函數類型一樣,@convention(c) T->U是一個非空的除非是它是可選的。@objc_block屬性由@convention(block)取代。
類型標注不能用於模式匹配,而需要作為標注聲明的一部分:
這意味著,以前的這樣的寫法:

[cpp] view plaincopy
var (a : Int, b : Float) = foo()
需要被重構為:

[cpp] view plaincopy
var (a,b) : (Int, Float) = foo()
其實這個改動原因是為了和元組用法相區分。

在Objective-C的枚舉類型導入到Swift時,已經廢棄的枚舉元素將不會影響可用元素的使用,這個可能需要Swift中一些枚舉名稱的改變。
從C中導入的枚舉類型都表示為RawRepresentable,這包括哪些沒有被聲明為NS_ENUM和NS_OPTIONS枚舉值,作為這個變化的一部分,所有這些枚舉類型中的value屬性都需要重名為rawValue.
find被重名為indexOf(),sort被重名為sortInPlace()以及sorted()重名為sort().
String.toInt()重名為Int(String)的可失敗構造器,因為構造器語法更適合類型轉換。
String類型不再遵循SequenceType,可以使用.characters,.utf8和.utf16對應字符集的運算。
在泛型函數中聲明了類型參數但是在函數中沒有使用時將產生一個編譯時錯誤,例如:
[cpp] view plaincopy
func foo<T>() { } // error: generic parameter ’T’ is not used in function signature
修復了Swift中泛型需求打印時“T==T”的錯誤。
修復了跨文件協議遵循時符號不可見或者重復的錯誤。
在Swift中增加了@objc(propertyName)屬性,當該屬性導入到Objective-C時可以采用這個propertyName作為getter/setter訪問器的默認名,例如:
[cpp] view plaincopy
class MyClass : NSObject {
@objc(theProperty) property: String // Objective-C屬性被命名為“theProperty”
// Objective-C getter訪問器被命名為“theProperty”
// Objective-C setter訪問器被命名為“setTheProperty:”
}

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved