當前位置:成語大全網 - 書法字典 - Xcode 7 beta發布,Swift 2.0帶來了哪些新變化?

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

Swift 2.0和Objective-C的更新

錯誤處理:我們可以在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)