美文网首页安安IOSiOStech materials
Swift 十二讲 第九讲 操作符重载和泛型

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

作者: zydscience | 来源:发表于2015-02-05 12:04 被阅读99次

    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>)
    } 
    

    相关文章

      网友评论

        本文标题:Swift 十二讲 第九讲 操作符重载和泛型

        本文链接:https://www.haomeiwen.com/subject/ayvrxttx.html