Swift之泛型类型与泛型参数

原创 2015年07月10日 11:45:25
import Foundation


func swapTwoInts(inout a: Int, inout b: Int)
{
    let temporaryA = a
    a = b
    b = temporaryA
}

func swapTwoStrings(inout a: String, inout b: String) {
    let temporaryA = a
    a = b
    b = temporaryA
}

func swapTwoDoubles(inout a: Double, inout b: Double) {
    let temporaryA = a
    a = b
    b = temporaryA
}


//泛型代码可以让你写出根据自我需求定义适用于任何类型的,灵活且可重用的函数和类型。它可以让你避免重复代码,用一种清晰和抽象的方式来表达代码的意图

//T为占位类型名字,可支持多个类型参数,命名在尖括号中,用逗号分开
func swapTwoValues<T>(inout a: T, inout b: T) {
    let temporaryA = a
    a = b
    b = temporaryA
}

var someInt = 3
var anotherInt = 107
swapTwoValues(&someInt, b: &anotherInt)

var someString = "hello"
var anotherString = "world"
swapTwoValues(&someString, b: &anotherString)



//MARK: - 泛型类型与泛型参数
struct IntStack {
    var items = [Int]()
    mutating func push(item: Int) {
        items.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")
// 现在栈已经有4个string了
let fromTheTop = stackOfStrings.pop()



//MARK: - 类型约束
//类型约束指定了一个必须继承自指定类的类型参数,或者遵循一个特定的协议或协议构成
/*
//第一个类型参数T,有一个需要T必须是SomeClass子类的类型约束;第二个类型参数U,有一个需要U必须遵循SomeProtocol协议的类型约束
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 array.enumerate() {
        if value == valueToFind {
            return index
        }
    }
    return nil
}
let strings = ["cat", "dog", "llama", "parakeet", "terrapin"]
if let foundIndex = findStringIndex(strings, valueToFind: "llama") {
    print("The index of llama is \(foundIndex)")
}
// 输出 "The index of llama is 2"


//Swift 标准库中定义了一个Equatable协议,该协议要求任何遵循的类型实现等式符(==)和不等符(!=)对任何两个该类型进行比较。所有的 Swift 标准类型自动支持Equatable协议。
func findIndex<T: Equatable>(array: [T], valueToFind: T) -> Int? {
    for (index, value) in array.enumerate() {
        if value == valueToFind {   //不是所有的 Swift 中的类型都可以用等式符(==)进行比较
            return index
        }
    }
    return nil
}

let doubleIndex = findIndex([3.14159, 0.1, 0.25], valueToFind: 9.3)
// doubleIndex is an optional Int with no value, because 9.3 is not in the array
let stringIndex = findIndex(["Mike", "Malcolm", "Andrea"], valueToFind: "Andrea")
// stringIndex is an optional Int containing a value of 2

版权声明:本文为博主原创文章,未经博主允许不得转载。

你不知道的泛型--获取具体的泛型参数类型

为什么擦除的泛型又可以获取具体的泛型参数信息, 在怎样的情况下可以获取? 这在哪些框架中使用到了?...
  • haoyifen
  • haoyifen
  • 2017年04月27日 19:44
  • 1462

通过反射获得泛型的实际类型参数

不知道大家有没有尝试过怎样获得一个泛型的实际类型参数?其实这个功能在hibernate中有广泛的应用,那么具体的操作是怎样的呢? 首先,要想直接通过一个变量拿到泛型类型中的实际参数显然是不可能的,参...
  • u012702547
  • u012702547
  • 2015年05月02日 16:36
  • 6606

Swift3.0 泛型<T>

泛型能够让开发者编写自定义需求已经任意类型的灵活可用的的函数和类型。能够让我们避免重复的代码。用一种清晰和抽象的方式来表达代码的意图。 1.泛型解决的问题 下面是一个非泛型的例子 func swa...
  • youshaoduo
  • youshaoduo
  • 2017年02月04日 16:42
  • 10873

Swift 泛型参数

原文:http://www.cocoachina.com/newbie/basic/2014/0612/8802.html 本页内容包括:泛型形参语句和泛型实参语句   ...
  • sqc3375177
  • sqc3375177
  • 2014年06月16日 22:16
  • 2387

获取泛型类中的泛型参数的类型

泛型类只是定义了一个泛型,还没有传递一个类型给这个泛型,所以他是一个kong...
  • cmalaya
  • cmalaya
  • 2014年09月23日 03:07
  • 2629

获取List集合泛型参数

获取List集合泛型参数 ArrayList list = new ArrayList(){}; System.out.println(list.getClass()); System.out....
  • u012550460
  • u012550460
  • 2017年07月07日 10:04
  • 514

java泛型-自定义泛型方法与类型推断总结

下面是自定义泛型方法的练习: package com.mari.generic;import java.util.ArrayList; import java.util.Collection; imp...
  • ShunXiangL
  • ShunXiangL
  • 2016年05月24日 01:03
  • 1152

获取泛型类的真实参数

获得某个类的泛型 package com; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; ...
  • dlf123321
  • dlf123321
  • 2015年09月21日 14:18
  • 1510

Java 运行时如何获取泛型参数的类型

在 Java 中对于下面最简单的泛型类 class A { public void foo() { //如何在此处获得运行时 T 的具体类型呢? } } 设想我们使用时 ne...
  • hj7jay
  • hj7jay
  • 2017年02月06日 09:24
  • 5603

C++的泛型编程和限制参数类型的技术探讨

                       C++的泛型编程和限制参数类型的技术探讨   模板概述泛型是C++中的重要特性。据说,已经在C++社区中已经取代面向对象成为C++的主要编程泛型。STL和...
  • shendl
  • shendl
  • 2008年01月12日 21:45
  • 7603
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Swift之泛型类型与泛型参数
举报原因:
原因补充:

(最多只允许输入30个字)