美文网首页安安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 十二讲 第九讲 操作符重载和泛型

    1. 操作符重载 Swift允许对操作符进行重载,也允许自己定义操作符。这个功能非常强大也很实用。操作符重载有两种...

  • [swift 进阶]读书笔记-第九章:泛型 C9P1 重载

    第九章:泛型 Generics 9.1 重载 Overloading 自由函数的重载 Overload Resol...

  • swift 关于sorted的坑

    有一句mmp不知当讲不当讲!!!1.关于swift 泛型集合的排序show me the example在...

  • Geekband C++ 第五周

    概述 C++模板简介 函数模板 C++类模板 操作符重载 泛型编程 容器

  • Swift 操作符

    Swift 支持重载操作符这样的特性。可以直接重载像 +,-,* 这样的操作符,因为 Swift 中已经有定义了 ...

  • C++ STL内核分析(1)

    本文预览: 源代码分布 OOP(面向对象编程) 和 GP(泛型编程) STL内核基础:操作符重载与模板 分配器(A...

  • Swift 泛型与重载

    编译器在编译泛型函数时,会根据实参类型,以泛型函数为模板,合成对应的函数。如果泛型函数有重载版本,编译器会以最接近...

  • Swift-泛型笔记

    Swift 泛型 Swift 提供了泛型让你写出灵活且可重用的函数和类型。 Swift 标准库是通过泛型代码构建出...

  • swfit-泛型

    和大多先进编程语言一样,swift拥有不少可以归类 泛型编程 的特性. 重载 拥有同样的名字,但是参数和返回类型不...

  • 2021-12-01

    swift5基本语法-泛型函数和泛型类型 Swift中泛型可以将类型参数化,提高代码复用率,减少代码量。 一、泛型...

网友评论

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

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