swift 泛型 + 协议 理解

前端之家收集整理的这篇文章主要介绍了swift 泛型 + 协议 理解前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

第一个:泛型 交换方法 N多文章都copy烂了 增强了一个泛型类型的判断

  1. var a = 0
  2. var b = 1
  3. var aStr = "a"
  4. var bStr = "b"
  5. print(a,b,aStr,bStr)
  6. swapValues(a: &a,b: &b)
  7. swapValues(a: &aStr,b: &bStr)
  8. print(a,bStr)
  9. let date = NSDate() //类型转字符串的方法
  10. print(NSStringFromClass(type(of: date)))
  11. print(NSStringFromClass(object_getClass(date)!))
  1. /// 泛型交换方法
  2. ///
  3. /// :param:
  4. /// :returns: void
  5. func swapValues <T> ( a:inout T,b:inout T) {
  6. let temp = a
  7. a = b
  8. b = temp
  9. if T.self == type(of: Int()) {
  10. print("数字交换")
  11. }else {
  12. print("字符串交换")
  13. }
  14. }
  15.  
  16. /// 查找数字位置
  17. ///
  18. /// :param:
  19. /// :returns: void
  20. func findIndex<T: Equatable> (_ array: [T],_ valueToFind: T) -> Int? {
  21. for (index,value) in array.enumerated(){
  22. if value == valueToFind { //如果没指定S:Equatable 这句话会编译不通过
  23. return index
  24. }
  25. }
  26. return 0
  27. }


第二个: 类中如何使用泛型 支持多个泛型

  1. class Stack<Element,Dacai> {
  2. var containers = [Element]()
  3. var containers2 = [Dacai]()
  4. func push(e: Element) {
  5. containers.append(e)
  6. }
  7. func pop() -> Element {
  8. return containers.removeLast()
  9. }
  10. func dcpush(e: Dacai) {
  11. containers2.append(e)
  12. }
  13. func dcPop() -> Dacai {
  14. return containers2.removeLast()
  15. }
  16. }
  1. var data1: Stack<Int,DCTool> = Stack<Int,DCTool>()
  2. var data2: Stack<String,DCTool> = Stack<String,DCTool>()
  3.  
  4. data1.push(e: 10)
  5. data1.dcpush(e: DCTool())
  6. data2.push(e: "10")
  7. data2.dcpush(e: DCTool())
  8. print(data1.containers,data1.containers2)
  9. print(data2.containers,data2.containers2)



第三个:protocol中 mutating关键词干嘛的

  1. protocol Vehicle {
  2. var numberOfWheels: Int {get}
  3. var color: UIColor {get set}
  4. mutating func changeColor()
  5. }
  6.  
  7. struct MyCar: Vehicle {
  8. let numberOfWheels = 4
  9. var color = UIColor.blue
  10. mutating func changeColor() {
  11. color = .red
  12. } //mutating 会报这个错误 Cannot assign to property: 'self' is immutable
  13. }
  14.  
  15. class MyFerrari: Vehicle {
  16. let numberOfWheels = 4
  17. var color = UIColor.red
  18. func changeColor() { //类中实现的协议 没有任何问题
  19. color = .black
  20. }
  21. }


第四个:扩展协议 where 的用法 关联类型

  1. protocol Father {
  2.  
  3. }
  4. protocol Son : Father{
  5.  
  6. }
  7.  
  8. class FatherClass: Father {
  9. }
  10.  
  11. class SonClass: Son {
  12. }
  13.  
  14.  
  15. protocol Container {
  16. associatedtype ItemType
  17. }
  18.  
  19. extension Container where ItemType: Father {
  20. var b: Int {return 100}
  21. }
  22.  
  23. extension Container where ItemType: Son {
  24. var b: Int {return 200}
  25. }
  26.  
  27. class TestClass: Container {
  28. typealias ItemType = SonClass //这里指定泛型的类型
  29. }
  30.  
  31. let myCass = TestClass()
  32. print (myCass.b)


第五个:实战WHERE的用法 协议 加载xib

  1. protocol NibLoadable {
  2.  
  3. }
  4.  
  5. extension NibLoadable where Self : UIView {
  6. static func loadFromNib(_ nibname : String? = nil) -> Self {
  7. let loadName = nibname == nil ? "\(self)" : nibname!
  8. return Bundle.main.loadNibNamed(loadName,owner: nil,options: nil)?.first as! Self
  9. }
  10. }

第六个:为什么swift要面向协议开发本质是什么 例子: 我们有3个控制器vc1 vc2 vc3 都要有showError的方法 1:第一种做法 写3个方法 是不是很恶心呢 2:第二种做法 父亲类不就行了吗 我们一下这样带来的问题,继承了fu类的是不是都需要这个方法

猜你在找的Swift相关文章