成都创新互联网站制作重庆分公司

怎么在iOS中实现多继承与多重代理-创新互联

本篇文章给大家分享的是有关怎么在iOS中实现多继承与多重代理,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

成都创新互联网络公司拥有十载的成都网站开发建设经验,近1000家客户的共同信赖。提供网站建设、网站制作、网站开发、网站定制、卖友情链接、建网站、网站搭建、自适应网站建设、网页设计师打造企业风格,提供周到的售前咨询和贴心的售后服务

1. 多继承

1. 实现过程

swift中的类可以遵守多个协议,但是只可以继承一个类,而值类型(结构体和枚举)只能遵守单个或多个协议,不能做继承操作.

多继承的实现:协议的方法可以在该协议的extension中实现

protocol Behavior {
 func run()
}
extension Behavior {
 func run() {
  print("Running...")
 }
}

struct Dog: Behavior {}

let myDog = Dog()
myDog.run() // Running...

无论是结构体还是类还是枚举都可以遵守多个协议,所以要实现多继承,无非就是多遵守几个协议的问题.

下面举个例子.

2. 通过多继承为UIView扩展方法

// MARK: - 闪烁功能
protocol Blinkable {
 func blink()
}
extension Blinkable where Self: UIView {
 func blink() {
  alpha = 1
  
  UIView.animate(
   withDuration: 0.5,
   delay: 0.25,
   options: [.repeat, .autoreverse],
   animations: {
    self.alpha = 0
  })
 }
}

// MARK: - 放大和缩小
protocol Scalable {
 func scale()
}
extension Scalable where Self: UIView {
 func scale() {
  transform = .identity
  
  UIView.animate(
   withDuration: 0.5,
   delay: 0.25,
   options: [.repeat, .autoreverse],
   animations: {
    self.transform = CGAffineTransform(scaleX: 1.5, y: 1.5)
  })
 }
}

// MARK: - 添加圆角
protocol CornersRoundable {
 func roundCorners()
}
extension CornersRoundable where Self: UIView {
 func roundCorners() {
  layer.cornerRadius = bounds.width * 0.1
  layer.masksToBounds = true
 }
}

extension UIView: Scalable, Blinkable, CornersRoundable {}

 cyanView.blink()
 cyanView.scale()
 cyanView.roundCorners()

怎么在iOS中实现多继承与多重代理

这样,如果我们自定义了其他View,只需要放大和缩小效果,遵守Scalable协议就可以啦!

3. 多继承钻石问题(Diamond Problem),及解决办法

请看下面代码

protocol ProtocolA {
  func method()
}

extension ProtocolA {
  func method() {
    print("Method from ProtocolA")
  }
}

protocol ProtocolB {
  func method()
}

extension ProtocolB {
  func method() {
    print("Method from ProtocolB")
  }
}

class MyClass: ProtocolA, ProtocolB {}

此时ProtocolA和ProtocolB都有一个默认的实现方法method(),由于编译器不知道继承过来的method()方法是哪个,就会报错.

?钻石问题Diamond Problem,当某一个类或值类型在继承图谱中有多条路径时就会发生.

解决方法:

1. 在目标值类型或类中重写那个发生冲突的方法method().

2. 直接修改协议中重复的方法.

文章开头我们提到的问题2,我们可以试着用多重代理去解决这个问题.

2. 多重代理

1. 多重代理的实现过程

我们以一个代理的经典问题来表述:

主人叫宠物们去吃饭,吃这个动作作为一个协议,我们要做到统一管理.

1. 定义协议

protocol MasterOrderDelegate: class {
  func toEat(_ food: String)
}

2. 定义一个类: 用来管理遵守协议的类

这边用了NSHashTable来存储遵守协议的类,NSHashTable和NSSet类似,但又有所不同,总的来说有这几个特点:

1. NSHashTable中的元素可以通过Hashable协议来判断是否相等.

2. NSHashTable中的元素如果是弱引用,对象销毁后会被移除,可以避免循环引用.

class masterOrderDelegateManager : MasterOrderDelegate {
  private let multiDelegate: NSHashTable = NSHashTable.weakObjects()

  init(_ delegates: [MasterOrderDelegate]) {
    delegates.forEach(multiDelegate.add)
  }
  
  // 协议中的方法,可以有多个
  func toEat(_ food: String) {
    invoke { $0.toEat(food) }
  }
  
  // 添加遵守协议的类
  func add(_ delegate: MasterOrderDelegate) {
    multiDelegate.add(delegate)
  }
  
  // 删除指定遵守协议的类
  func remove(_ delegateToRemove: MasterOrderDelegate) {
    invoke {
      if $0 === delegateToRemove as AnyObject {
        multiDelegate.remove($0)
      }
    }
  }
  
  // 删除所有遵守协议的类
  func removeAll() {
    multiDelegate.removeAllObjects()
  }

  // 遍历所有遵守协议的类
  private func invoke(_ invocation: (MasterOrderDelegate) -> Void) {
    for delegate in multiDelegate.allObjects.reversed() {
      invocation(delegate as! MasterOrderDelegate)
    }
  }
}

3. 其余部分

class Master {
  weak var delegate: MasterOrderDelegate?
  func orderToEat() {
    delegate?.toEat("meat")
  }
}

class Dog {}
extension Dog: MasterOrderDelegate {
  func toEat(_ food: String) {
    print("\(type(of: self)) is eating \(food)")
  }
}

class Cat {}
extension Cat: MasterOrderDelegate {
  func toEat(_ food: String) {
    print("\(type(of: self)) is eating \(food)")
  }
}

let cat = Cat()
let dog = Dog()
let cat1 = Cat()

let master = Master()
// master的delegate是弱引用,所以不能直接赋值
let delegate = masterOrderDelegateManager([cat, dog])
// 添加遵守该协议的类
delegate.add(cat1)
// 删除遵守该协议的类
delegate.remove(dog)

master.delegate = delegate
master.orderToEat()

// 输出
// Cat is eating meat
// Cat is eating meat

以上就是怎么在iOS中实现多继承与多重代理,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注创新互联网站建设公司行业资讯频道。

另外有需要云服务器可以了解下创新互联建站www.cdcxhl.com,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


分享文章:怎么在iOS中实现多继承与多重代理-创新互联
转载注明:http://cxhlcq.com/article/iocgp.html

其他资讯

在线咨询

微信咨询

电话咨询

028-86922220(工作日)

18980820575(7×24)

提交需求

返回顶部