安安IOSiOStech materials

Swift 十二讲 第九讲 操作符重载和泛型

2015-02-05  本文已影响99人  zydscience

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>)
} 
上一篇 下一篇

猜你喜欢

热点阅读