澳门至尊网站-首页

您的位置:澳门至尊网站 > 黑客安全 > Swift泛型协议的N种用法

Swift泛型协议的N种用法

2019-11-28 16:31

  They said "you should learn a new language every year," so I  learned Swift. Now  I  learn a new language every two weeks!

  那几个笑话相对是自己看过的斯维夫特被黑的最惨的三遍!所以明天大家来学习一下Swift的泛型。

  Swift的泛型有一点诡异,针对Class和Function,都以透过<Type>来定义,和C#生龙活虎摸相仿,同样也可以有where关键字张开限定。

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

class CanPrintBase<T> {
    func PrintType(output: T) -> Void {}
}

  不过直面Interface,也正是Swift里的Protocol,须要接受associatedtype关键字来定义泛型:

protocol CanPrint {
    
    associatedtype E
    
    func PrintType(output: E) -> Void
}

  那要怎么去实现这些接口呢?经常是那样子的:

class TypePrinter0 : CanPrint{
    
    typealias E = String
    
    func PrintType(output: E) {
        print(type(of:output))
    }
}

let print0 = TypePrinter0()
print0.PrintType(output: "String Type")

  然后就能够在output窗口打印“String”。

  阿西吧!这么意料之外的语法差比相当少不能够忍!就不能够用<Type>来写啊?

  曲线救国的话,大家能够思谋模拟二个虚幻类class CanPrintBase<T>,通过延续来贯彻平等的机能:

class TypePrinter3: CanPrintBase<String>{
    
    override func PrintType(output: String){
         print(type(of:output))
    }
}

let print3 = TypePrinter3()
print3.PrintType(output: "String Type")

  那么大家像C#同生机勃勃间接在类定义的时候经过占位符的点子得以嘛?

//This one cannot work!
class TypePrinter1<E: String> : CanPrint{
   
    func PrintType(output: E) {
        print(output)
    }
}

  错误提醒为:Inheritance from non-protocol, non-class type 'String'。相当于说借使是class类型的话就能够:

public class SomeType {}

class TypePrinter2<E: SomeType> : CanPrint{

    func PrintType(output: E) {
        print(output)
    }

}

let print2 = TypePrinter2()
print2.PrintType(output: SomeType())

  反之我们也能够写成这么:

class TypePrinter5 : CanPrint{
    
    typealias E = SomeType
    
    func PrintType(output: E) {
        print(output)
    }
}

let print5 = TypePrinter5();
print(type(of: print5))
print(type(of: print2))

  将项目打字与印刷出来的话,分别是TypePrinter5和TypePrinter2<SomeType>,也正是说那三种写法得到的类型是截然不菲年老成致的。

  呵呵也是蛮妖的呗,还足以把品种的切实可行定义留到使用时再声称:

class TypePrinter4<E> : CanPrint{
    
    func PrintType(output: E) {
        print(output)
    }
}
let print4 = TypePrinter4<SomeType>()
print4.PrintType(output: SomeType())

let print6 = TypePrinter4<String>()
print6.PrintType(output: "I am a String")

  那点又和C#傻傻分不清楚了。

  本篇实乃蛮无聊的纠葛与Swift泛型公约的语法,如孔乙己般尝试了回字的N种写法。至于怎么斯威夫特要这么设计,大家下风度翩翩篇能够尝尝和C#对待看看。

  GitHub:

  

 

 

本文由澳门至尊网站发布于黑客安全,转载请注明出处:Swift泛型协议的N种用法

关键词:

  • 上一篇:没有了
  • 下一篇:没有了