温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Swift2.0(17)泛型技术

发布时间:2020-03-04 03:39:35 来源:网络 阅读:505 作者:ymanmeng123 栏目:移动开发
  • 泛型技术

何为泛型?

     简单理解:代码具有与类型无关的通用性

Objective-C在Xcode7开始,引入了泛型技术的应用

Swift支持相对比较完整的泛型技术


  • 泛型函数

格式: func 函数名<类型>(参数列表)->返回类型 {}

如:

    func my_swap<T>(inout value1 value1:T, inout value2:T) {
       
var tmp:T
        tmp = value1
        value1 = value2
        value2 = tmp
    }
   
var a1 = 10, a2 = 20
   
my_swap(value1: &a1, value2: &a2)
   
print("a1=\(a1) a2=\(a2)") //a1=20 a2=10
    var b1 = 3.14, b2 = 1.23
   
my_swap(value1: &b1, value2: &b2) //b1=1.23 b2=3.14

    print("b1=\(b1) b2=\(b2)")

  • 通用类型

实现类似Array、Dictionary可以存储各种数据类型

如实现一个栈结构体:

    struct Stack<T> {
       
private var items = [T]()
       
var count:Int {
           
get {
               
return items.count
            }
        }
       
mutating func push(value:T) {
           
items.append(value)
        }
       
mutating func pop()->T? {
           
if items.count == 0 {
               
return nil
            }
           
else {
               
return items.removeLast()
            }
        }

    }

    var s:Stack<Int> = Stack<Int>()
   
s.push(10)
   
s.push(20)
   
s.push(30)
   
print(s.pop())
   
print(s.pop())

    print(s.pop())

再如一个简单的类类型

     class A<T> {

         var value:T?

     }

     var a = A<Double>()

     a.value = 3.14


  • 类型约束

语法:<T:协议1,协议2,...>

     表示T通用类型必须是遵循了协议1、协议2的类型

如:Swift标准库的自带协议Equatable定义了==运算符重载函数的接口

     并且大部分Swift的基本数据类型都遵循并实现了该协议

    func isEqual<T:Equatable>(left:T, right:T)->Bool {
       
return left == right
    }

    print(isEqual(3.14, right: 3.15))


  • 关联类型

关联类型的含义:在协议中使用泛型技术

如:

    protocol AProtocol {
       
typealias itemType  //占位类型
        func push(item:itemType)
       
func pop()->itemType?
    }
   
class A:AProtocol {
       
var items = [Int]()

       

        typealias itemType = Int //******

        func push(item: itemType) {
           
items.append(item)
        }
       
func pop()->itemType? {
           
if items.count == 0 {
               
return nil
            }
           
else {
               
return items.removeLast()
            }

    }        


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI