Swift---泛型(Generics)

泛型使您能够编写灵活的、可重用的功能和类型的代码。

例如要交换两个变量值的问题

不用泛型

//Int类型交换
func swapTwoInts(inout a: Int, inout b: Int){
  let temp = a
  a = b
  b = temp
}

var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, &anotherInt)
println("someInt is now \(someInt), and anotherInt is now \(anotherInt)")

// prints "someInt is now 107, and anotherInt is now 3"

//String类型交换
func swapTwoStrings(inout a: String, inout b: String){
  let temp = a
  a = b
  b = temp
}

//Double类型交换
func swapTwoDoubles(inout a: Double, inout b: Double){
  let temp = a
  a = b
  b = temp
}

使用泛型

func swapTwoValues<T>(inout a: T, inout b: T){
  let temp = a
  a = b
  b = temp
}

var someInt = 3
var anotherInt = 107
swapTwoValues(&someInt, &anotherInt)
// someInt is now 107, and anotherInt is now 3

var someString = "hello"
var anotherString = "world"
swapTwoValues(&someString, &anotherString)
// someString is now "world", and anotherString is now "hello"

Swift中自带的Array和Dictionary都是使用泛型实现的,下面通过泛型自定义简单的Stack

不用泛型

struct IntStack{
  var items = Int[]()
  mutating func push(item: Int){
    item.append(item)
  }

  mutating func pop() -> Int {
    return items.removeLast()
  }
}

使用泛型

struct Stack<T>{
  var items = T[]()
  mutating func push(item: T){
    items.append(item)
  }

  mutating func pop() -> T {
    return items.removeLast()
  }
}

var stackOfStrings = Stack<String>()
stackOfStrings.push("uno")
stackOfStrings.push("dos")
stackOfStrings.push("tres")
stackOfStrings.push("cuatro")
// the stack now contains 4 strings

let fromTheTop = stackOfStrings.pop()
// fromTheTop is equal to "cuatro", and the stack now contains 3 strings

类型限制

func someFunction<T: SomeClass, U: SomeProtocol>(someT: T, someU: U){
  // function body goes here
}

func findStringIndex(array: String[], valueToFind: String) -> Int? {
  for(index, value) in enumerate(array) {
    if value == valueToFind {
      return index
    }
  }
  return nil
}

let strings = ["cat", "dog", "llama", "parakeet", "terrapin"]
if let foundIndex = findStringIndex(strings, "llama") {
  println("The index of llama is \(foundIndex)")
}

// prints "The index of llama is 2"

func findIndex<T>(array: T[], valueToFind: T) -> Int? {
  for(index, value) in enumerate(array) {
    if value == valueToFind {
      return index
    }
  }
  return nil
}

func findIndex<T: Equatable>(array: T[], valueToFind: T) -> Int? {
  for(index, value) in enumerate(array) {
    if value == valueToFind {
      return index
    }
  }
  return nil
}

let doubleIndex = findIndex([3.14159, 0.1, 0.25], 9.3)
// doubleIndex is an optional Int with no value,
// because 9.3 is not in the array

let stringIndex = findIndex(["Mike", "Malcolm", "Andrea"], "Andrea")
// stringIndex is an optional Int containing a value of 2

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序猿DD

你真的了解lambda吗?一文让你明白lambda用法与源码分析

本文链接: http://www.cmlanche.com/2018/07/22/lambda用法与源码分析/

14020
来自专栏coder修行路

Go基础之--数组和切片

数组 数组的定义: 数组是具有固定长度并拥有零个或者多个相同数据类型元素的序列 定义一个数组的方法: var 变量名[len] type 例子: var a[5...

23690
来自专栏一个爱瞎折腾的程序猿

LINQ

select:提取要查询的数据                 where:筛选满足条件的元素   

11110
来自专栏java一日一条

Java Lambda 表达式学习笔记

Java Lambda 表达式是 Java 8 引入的一个新的功能,可以说是模拟函数式编程的一个语法糖,类似于 Javascript 中的闭包,但又有些不同,主...

8110
来自专栏一枝花算不算浪漫

[读书笔记]C#学习笔记四: C#2.0泛型 可控类型 匿名方法和迭代器

444110
来自专栏mathor

比较器Comparator

 java中有内置的排序,Arrays.sort(),现在我有一个Student类,类中三个成员变量name,id,age,我现在想以age作为参考进行升序排序...

22620
来自专栏blackheart的专栏

[C#2] 4-可空类型、静态类

1. 可空类型 值类型是不可以为null的[即不可为空值], 假如我们想让它为null呢[比如它对映这数据库中的某个表的某个字段,但是这个字段是null]。 自...

21750
来自专栏菩提树下的杨过

linq to sql的多条件动态查询(下)

借助老外写的一个扩展表达式的类,可以把上篇中的代码写得更优雅 这是PredicateBuilder的源文件 public static class Predic...

25190
来自专栏分布式系统和大数据处理

C#类型基础

本文之初的目的是讲述设计模式中的 Prototype(原型)模式,但是如果想较清楚地弄明白这个模式,需要了解对象克隆(Object Clone),Clone其实...

10730
来自专栏null的专栏

每周算法练习——大数的乘法问题

    大数问题的思路是使用矩阵或者字符串来存储,今天我试着用Java实现了这样的功能,这段程序只是基本模拟大数乘法,当然实现的只是基本的原理。 Java代码:...

38160

扫码关注云+社区

领取腾讯云代金券