錯誤處理:我們可以在Swift中構建壹個功能來拋出、捕捉和管理錯誤。我們可以聯系並處理可恢復的錯誤,如“文件未找到”或網絡超時,Swift和錯誤處理可以與NSError無縫交互。
可用性檢查:如果在舊的部署平臺上調用新系統版本引入的API,將會觸發編譯時錯誤。我們可以在if或guard條件語句中使用#available()函數來檢查API函數的可用性:例如:
如果#可用(iOS8.0,OSX10.10,*){
//版本匹配時使用HandoffAPIs。
letactivity=
NSUserActivity(activity type:" com . example . shopping list . view ")
activity.becomeCurrent()
}否則{
//當版本不匹配時返回。
}
您可以在代碼聲明中使用@available()屬性聲明來指定可用性信息。例如:
@可用(iOS8.0,OSX10.10,*)
funcstartUserActivity()-& gt;不安全{
...
}
表示startUserActivity()方法僅在iOS8.0+完整版、OSX10.10+等平臺上可用。
協議的可擴展性:現在我們可以為協議類型編寫擴展,這樣我們就可以為遵循協議的任何類添加方法或屬性,這極大地重用了我們的代碼。
協議默認實現:您現在可以為協議擴展中指定的需求提供壹個默認實現,這樣您就可以使用諸如“mixin”和“trait”這樣的模式。
新的defer語句:該語句用於在代碼生命周期結束時進行清理。當在並發開發中使用新的錯誤處理模型時,這個特性非常有用。例如:
letf=fopen("x.txt "," r ")
延期{fclose(f)}
如果出現錯誤,Tryfoo(f)//f將被關閉。
letf2=fopen("y.txt "," r ")
延期{fclose(f2)}
Trybar(f,f2)//如果出現錯誤,f2關閉,然後F關閉。
}//f2關閉,如果沒有錯誤,F關閉。
新的guard語法:這個新語法允許您在代碼周期中構建壹個早期退出點。例如:
guardletz=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語句中的代碼塊嵌套,例如:
做{
//新聞範圍
做{
//另壹個範圍
}
}
可測試性:Swift2.0框架和App的測試現在不需要將內部功能代碼路由到公共代碼。在要測試的代碼中使用@testable import {ModuleName}語法,使所有內部私有和公共代碼都可用。App或框架的目標需要在編譯時啟用“啟用可測性”編譯設置。這個“啟用可測試性”編譯屬性只能在調試配置中使用,因為它需要導出內部符號信息,這阻礙了代碼優化。
支持C函數指針:以函數指針為函數參數的C函數會被閉包或全局函數調用。由於這個限制,閉包不能捕獲它們的上下文。例如,標準C庫函數qsort將被如下調用:
vararray=
qsort(& amp;array,array.count,sizeof value(array[0]){ a,bin
return int 32(unsafe pointer & lt;Int & gt(壹)。memory-unsafe pointer & lt;Int & gt(二)。內存)
}
打印(數組)
增強的診斷信息:添加了新的警告消息,鼓勵盡可能使用let而不是var。同時,增加了新的警告信息,提示未使用的變量、無法觸發開關情況下的分支判斷等。,同時switch語句耗盡的判斷更加智能。
SIMD支持:Clang中擴展的矩陣算法可以在swift中導入使用,在Swift中實現大數據量的圖形算法或其他系統級的數據操作是可能的。
枚舉現在支持多泛型關聯值,例如:
enumEither & ltt,U & gt{
案例左(T),右(U)
}
現在,在打印特定的枚舉類型值時,可以顯示枚舉值和附加值,但對於@objc類型的枚舉類型或具有多個附加值的枚舉類型,不支持這樣做。
現在允許編寫泛型類型的公共擴展。例如:
publicextensionArray{…}
非泛型類可以從泛型類繼承。
Swift字符串文字量的連接,包括跨行文本,現在保證在編譯時得到優化。
失敗便利構造函數現在允許在調用self之前調用return nil語句。init指定構造函數必須在返回nil之前初始化所有存儲屬性,這是壹個已知的限制。
嵌入式函數現在可以遞歸地引用函數本身或其他嵌入式函數。
If條件語句現在支持標記,妳可以使用break跳出壹個帶標記的if判斷。請註意,未標記的break語句只能在循環或switch/case語句中使用,不能在if中使用。
新的x?語句用於匹配可選類型。
壹個新的@nonobjc屬性用於有選擇地禁止導出實例,它對應於@objc。
標準庫中增加了壹個新函數:readLine()。
操場
富文本註釋:使用Markdown風格的語法來解釋代碼的功能。
內聯結果:直接在代碼下面顯示代碼的輸出結果。
資源:允許您使用項目導航器面板將圖片等資源添加到Playground。
輔助代碼:額外的代碼保留在操場本身之外,用於輔助功能。
分頁:操場結構的組織方式類似於Bundle。
詳細解釋Swift語言的變化
聲明:
打電話:
避免調用以下位運算:
選項設置支持文字語法和設置樣式調用,如contains:
Swift 1.2:
Swift 2.0:
Swift 1.2:
Swift 2.0:
參數概述語法:
單參數語法:
返回值:
對於需要在QuickHelp中突出顯示的其他語法字段,請參考Markdown語法。
這意味著在過去,它是這樣寫的:
需要重建為:
其實之所以這麽改,是為了和元組用法區分開來。
修復了在Swift中打印通用要求時“T==T”的錯誤。
修正了壹個錯誤,符號是不可見的或重復時,跨文件協議遵循。
Swift中增加了屬性@objc(propertyName)。當屬性被導入Objective-C時,這個propertyName可以用作getter/setter訪問器的默認名稱,例如:
Objective-C的枚舉類型導入Swift時,過時的枚舉元素不會影響可用元素的使用,這可能需要更改Swift中的壹些枚舉名稱。
從C導入的枚舉類型都表示為RawRepresentable,其中包括未聲明為NS_ENUM和NS_OPTIONS的枚舉值。作為這壹更改的壹部分,所有這些枚舉類型中的值屬性都需要重命名為rawValue。
Find重命名為indexOf(),sort重命名為sortInPlace(),sorted()重命名為sort()。
String.toInt()是壹個與Int(String)同名的失敗構造函數,因為構造函數語法更適合類型轉換。
字符串類型不再遵循SequenceType,而是可以使用。字符、. utf8和。utf16。
當類型參數在泛型函數中聲明,但沒有在函數中使用時,將會發生編譯時錯誤,例如:
CFunctionPointer & ltt->;U & gt該類型已被移除,C函數現在用新的@convention(c)屬性聲明。像其他函數類型壹樣,@ @ conventi on(c)T->-->;除非是可選的,否則u不為空。@objc_block屬性被替換為@convention(block)。
類型批註不能用於模式匹配,但需要成為批註聲明的壹部分:
Swift的文檔註釋現在基於Markdown語法。
Println和print合並成壹個帶有默認參數的打印函數:
do/while循環被重命名為repeat/while,這更明顯:
在Swift中,新的選項設置類型可以按照結構遵循OptionSetType協議的方式編寫。如果在此類型中指定了rawValue屬性和static let的常量定義,標準庫將為其他選項提供默認實現:
NS_OPTIONS類型現在遵循OptionSetType協議,這可以避免set樣式的接口調用:
OS X 10.11、iOS 9和watchOS 2 SDK采用了壹些Objective-C特性來改善Swift的編程體驗,比如可空性、類型化集合和壹些其他特性。
很多通用的全局函數(比如map、filter、sort)都是在標準庫中重構的,這些方法是通過協議擴展添加的。這個優點是可以很好的適應其他的關聯類型。
方法和函數現在使用相同的參數命名規則。我們可以用“_”符號省略外部參數名。為了簡化使用,用於指定參數名稱的簡化符號“#”被刪除,因為Swift為默認參數提供了特殊規則:
classMyClass:NSObject{
@ objc(theProperty)property:string//objective-c屬性命名為“the property”。
//將//Objective-Cgetter訪問器命名為“theProperty”。
//Objective-Csetter訪問器被命名為“setTheProperty:”
}
funcfoo & ltT & gt(){ }//錯誤:generic parameter t ' isnotusedinfunctionsignature
var(a,b):(Int,Float)=foo()
var(a:Int,b:Float)=foo()
-退貨:...
-參數x:...
-參數:..
-參數:
-x:...
-y:...
func print(& lt;stufftoprint & gt,appendNewline:Bool=true)
func print(& lt;stufftoprint & gt)
funcprintln(& lt;stufftoprint & gt)
重復
...
} while & lt條件& gt
做{
...
} while & lt條件& gt
structMyOptions:OptionSetType{
letrawValue:Int
staticletTuringMachine = my options(原始值:1)
staticletlambdalculus = my options(raw value:2)
staticletVonNeumann = my options(raw value:4)
}
letchurcturing:my options =[。渦輪機。λcalculus]
object . invokemethodwithoptions([。選項a,。選項B])
object . invokemethodwithoptions([])
ifoptions.contains(。選項C){
//.OptionCisset
}
//Swift1.2:
object.invokeMethodWithOptions(。選項A|。選項b)
object . invokemethodwithoptions(nil)
ifoptions & amp。OptionC==。選項C{
//.選項c已設置。
}
printFunction("hello ",newline:true)
printMethod("hello ",newline:true)
printFunctionOmitParameterName(" hello ",true)
funcprintFunction(str:String,newline:Bool)
funcprintMethod(str:String,newline:Bool)
funcprintFunctionOmitParameterName(str:String,_newline:Bool)