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

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

相关文章推荐

Swift 泛型参数

原文:http://www.cocoachina.com/newbie/basic/2014/0612/8802.html 本页内容包括:泛型形参语句和泛型实参语句   ...

Swift 泛型参数(Generic Parameters and Arguments)

本节涉及泛型类型、泛型函数以及泛型初始化器(initializer)的参数,包括形参和实参。声明泛型类型、函数或初始化器时,须指定相应的类型参数。类型参数相当于一个占位符,当实例化泛型类型、调用泛型函...

Java获取泛型参数的类型的方法

最近在使用Google的Gson包进行Json和Java对象之间的转化,对于包含泛型的类的序列化和反序列化Gson也提供了很好的支持,感觉有点意思,就花时间研究了一下。 由于Java泛型的实现机制,...
  • canchew
  • canchew
  • 2012年05月20日 15:12
  • 18081

跳过编译器,获取泛型参数的实际类型

import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; import java.lang.reflec...
  • xyang81
  • xyang81
  • 2012年02月12日 19:26
  • 2765

黑马程序员-通过反射获取泛型参数类型

----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------ package com.itcast.test2; import jav...
  • remo866
  • remo866
  • 2012年08月02日 17:59
  • 533

java获取泛型参数的类型的方法 - 实例讲解

在Java中,我们常常 需要获取泛型参数的类型,比如将使用了泛型的Java代码进行序列化和反序列化的时候。 一、在开始试图去获取泛型参数的类型前,可以试着去执行如下的类,看看执行的结果: /** ...

Gson通过借助TypeToken获取泛型参数的类型的方法(转)

最近在使用Google的Gson包进行Json和Java对象之间的转化,对于包含泛型的类的序列化和反序列化Gson也提供了很好的支持,感觉有点意思,就花时间研究了一下。 由于Java泛型的实现机...

如何获取java中泛型参数的实际类型--反射获取

package cn.itcast.oa.base.impl; import java.lang.reflect.ParameterizedType; import java.lang.reflec...

java反射机制获取泛型参数类型

package com.dasenlin.reflectionconstractor;import java.lang.reflect.Method; import java.lang.reflect...

java——用泛型参数类型构造数组

前一阵子打代码的时候突然想到一个问题。平时我们的数组都是作为一个参数传入方法中的,如果我们要想在方法中创建一个数组怎么样呢?在类型明确的情况下,这是没什么难度的。如果我们传入的参数是泛型类型的参数呢?...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Swift之泛型类型与泛型参数
举报原因:
原因补充:

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