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:”
}
本站文章版權歸原作者及原出處所有 。內容為作者個人觀點, 并不代表本站贊同其觀點和對其真實性負責,本站只提供參考并不構成任何投資及應用建議。本站是一個個人學習交流的平臺,網站上部分文章為轉載,并不用于任何商業目的,我們已經盡可能的對作者和來源進行了通告,但是能力有限或疏忽,造成漏登,請及時聯系我們,我們將根據著作權人的要求,立即更正或者刪除有關內容。本站擁有對此聲明的最終解釋權。