狐帝 發表於 2022-9-13 14:56:52

Swift Extension扩展得使用详细介绍

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>扩展(Extension)</li><li>协议与初始化器</li><ul class="second_class_ul"><li>协议</li><li>泛型</li></ul></ul></div><p class="maodian"></p><h2>扩展(Extension)</h2>
<p>1、Swift中的扩展,有点类似于OC中的分类(Category)</p>
<p>2、扩展可以为枚举、结构体、类、协议添加新功能</p>
<p>可以添加方法、计算属性、下标、(便捷)初始化器、嵌套类型、协议等等</p>
<p>3、扩展不能办到的事情</p>
<p>不能覆盖原有的功能</p>
<p>不能添加存储属性,不能向已有的属性添加属性观察器</p>
<p>不能添加父类</p>
<p>不能添加指定初始化器,不能添加反初始化器</p>
<p>。。。。</p>
<div class="jb51code"><pre class="brush:java;">extension Double {
    var km: Double {
      self * 1_000.0
    }
    var m: Double {
      self
    }
    var dm: Double {
      self / 100.0
    }
    var cm: Double {
      self / 10.0
    }
    var mm: Double {
      self / 1_000.0
    }
}
var d = 100.0
d.km
d.m
d.dm</pre></div>
<div class="jb51code"><pre class="brush:java;">var arr: Array&lt;Int&gt; =
extension Array {
    subscript(nullable idx: Int) -&gt; Element? {
      if (startIndex ..&lt; endIndex).contains(idx) {
            return self
      }
      return nil
    }
}
print(arr ?? 0)</pre></div>
<div class="jb51code"><pre class="brush:java;">extension Int {
    func repeats(task: () -&gt; Void) {
      for _ in 0..&lt;self {
            task()
      }
    }
    enum Kind {
      case negative, zero, positive
    }
    var kind: Kind {
      switch self {
      case 0: return .zero
      case let x where x &gt; 0: return.positive
      default: return .negative
      }
    }
    subscript(digitIndex: Int) -&gt; Int {
      var decimalBase = 1
      for _ in 0..&lt;digitIndex {
            decimalBase *= 10
      }
      return (self / decimalBase) % 10
    }
}</pre></div>
<p class="maodian"></p><h2>协议与初始化器</h2>
<div class="jb51code"><pre class="brush:java;">class Person {
    var age: Int
    var name: String
    init(age: Int, name: String) {
      self.age = age
      self.name = name
    }
}
extension Person: Equatable {
    static func == (left: Person, right: Person) -&gt; Bool {
      left.age == right.age &amp;&amp; left.name == right.name
    }
    convenience init() {
      self.init(age: 0, name: "")
    }
}</pre></div>
<p>1、如果希望自定义初始化器的同时,编译器也能够生成默认初始化器,那么可以在扩展中编写自定义初始化器</p>
<div class="jb51code"><pre class="brush:java;">struct Point {
    var x: Int = 0
    var y: Int = 0
}
extension Point {
    init(_ point: Point) {
      self.init(x: point.x, y: point.y)
    }
}</pre></div>
<p>2、required初始化器不能写在扩展中</p>
<p class="maodian"></p><h3>协议</h3>
<p>1、如果一个类型已经实现了协议的所有要求,但是还没有声明它遵守了这个协议</p>
<p>可以通过扩展来让它遵守这个协议</p>
<p>2、给协议进行扩展后,凡是遵守了这个协议的都会有对应的扩展方法,以下面为例,编写一个函数,判断一个证书是否为奇数。</p>
<div class="jb51code"><pre class="brush:java;">extension BinaryInteger {
    func isOdd() -&gt; Bool {
      self % 2 != 0
    }
}</pre></div>
<p>3、扩展可以给协议提供默认实现,也间接实现 可选协议 的效果</p>
<div class="jb51code"><pre class="brush:java;">protocol TestProtocol {
    func test1()
}
extension TestProtocol {
    func test1() {
      print("TestProtocol test1")
    }
    func test2() {
      print("TestProtocol test2")
    }
}
class TestClass: TestProtocol {
    func test1() {
      print("TestClass test1")
    }
    func test2() {
      print("TestClass test2")
    }
}
var cls: TestProtocol = TestClass()
cls.test1() //TestClass test1
cls.test2() //TestProtocol test2</pre></div>
<p class="maodian"></p><h3>泛型</h3>
<p>1、扩展中依然可以使用原类型中的泛型类型</p>
<p>2、符合条件才扩展</p>
<div class="jb51code"><pre class="brush:java;">extension Stack: Equatable where E: Equatable {
}</pre></div>
<p>到此这篇关于Swift Extension扩展得使用详细介绍的文章就介绍到这了,更多相关Swift Extension内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>Swift利用Decodable解析JSON的一个小问题详解</li><li>关于Swift 4.1中的Codable改进详解</li><li>swift语言AutoreleasePool原理及使用场景</li><li>swift语言Codable 用法及原理详解</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: Swift Extension扩展得使用详细介绍