1. 操作符重載
Swift允許對操作符進行重載,也允許自己定義操作符。這個功能非常強大也很實用。操作符重載有兩種,第一種是對二元操作符,例如加減乘除。第二種是一元操作符重載,例如++。
- 二元操作符重載
二元操作符重載,其實就是定義了一個新的函數。這個函數的輸入是兩個值,輸出是一個值。其寫法很自然如下面例子:
func - (a:Int,b:Int)->String
{
return String(a+b) + "重載成功"
}
var a = 1
var b = ""
b = a-1
println(b) //輸出為字符串:"2重載成功"
//注意這里b不是inout類型,所以沒沖突
- 一元操作符重載
一元操作符重載就是定義一個新的輸入參數只有一個的函數。但你要制定是前置還是后置的一元操作符。如下例:
postfix func ++ (inout i:Int)->Int
{
println("重載成功")
return i+10
}
var a = 1
println(a++) //輸出為"重載成功"和"11"
- 自定義操作符
你也可以自定義操作符。和函數不同的是,你需要先聲明,然后在自定義操作符之前寫好postfix,prefix,infix之一的關鍵字即可。例如我們可以自定義一個求階乘的操作符:
postfix operator *** {}
postfix func ***(c:Int)->Int
{var a = 1
for i in 1..<c+1
{a = a*i}
return a
}
println(3***) //輸出為6,3的階乘
筆者認為,自定義操作符,沒有多大必要。前置后置特殊符號,增加代碼閱讀難度。還是用函數方便可靠。
2. 泛型
泛型的意思就是一些函數或者類,可以用于不同的類型。例如通常函數的輸入參數一般是指定類型的?,F在你可以用大寫T來代替。
- 函數泛型
函數泛型的寫法為:
func 函數名<T>(參數列表,里面類型用T代替)
{函數體}
例如:
func swapTwoValues<T>(inout a: T, inout b: T) {
let x = a
a = b
b = x
}
var a = "xx"
var b = "yy"
swapTwoValues(&a,&b)
println(a) //輸出yy
println(b) //輸出xx
泛型也可以用于結構體,類和協議。但是語法就相當復雜。(類似于C++的模板) 這里就不多講了。有興趣的讀者可以去查手冊。但我的理解,這部分有可能還會演變。畢竟Swift只是初版,將來也許會有變化。所以這里就不展開了。
最后,我們鍵入Array,用command+click調出數組的定義源碼。我們可以看到,Array是用generic定義的。
struct Array<T> : MutableCollectionType, Sliceable {
/// The type of element stored by this `Array`
typealias Element = T
/// Always zero, which is the index of the first element when non-empty.
var startIndex: Int { get }
/// A "past-the-end" element index; the successor of the last valid
/// subscript argument.
var endIndex: Int { get }
subscript (index: Int) -> T
/// Return a *generator* over the elements.
///
/// Complexity: O(1)
func generate() -> IndexingGenerator<[T]>
/// A type that can represent a sub-range of an `Array`
typealias SubSlice = Slice<T>
subscript (subRange: Range<Int>) -> Slice<T>
/// Initialization from an existing buffer does not have "array.init"
/// semantics because the caller may retain an alias to buffer.
init(_ buffer: _ArrayBuffer<T>)
}