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. 泛型
泛型的意思就是一些函数或者类,可以用于不同的类型。例如通常函数的输入参数一般是指定类型的。现在你可以用大写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>)
}
网友评论