Blame view

Twear/Tools/String+Extension.swift 1.94 KB
75d24c15   yangbin   123
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
  //
  //  s.swift
  //  Twear
  //
  //  Created by yangbin on 2021/12/6.
  //
  import UIKit
  //import CommonCrypto
  
  extension StringProtocol {
      var hexaData: Data { .init(hexa) }
      var hexaBytes: [UInt8] { .init(hexa) }
      private var hexa: UnfoldSequence<UInt8, Index> {
          sequence(state: startIndex) { start in
              guard start < self.endIndex else { return nil }
              let end = self.index(start, offsetBy: 2, limitedBy: self.endIndex) ?? self.endIndex
              defer { start = end }
              return UInt8(self[start..<end], radix: 16)
          }
      }
  }
  
  extension String {
      
      var length: Int {
          return self.count
      }
      
      
      
      subscript (i: Int) -> String{
          return self[i ..< i + 1]
      }
      
      func substring(fromIndex: Int) -> String {
          return self[min(fromIndex, length) ..< length]
      }
      
      func substring(toIndex: Int) -> String {
          return self[0 ..< max(0, toIndex)]
      }
      
      subscript (r: Range<Int>) -> String {
          let range = Range(uncheckedBounds: (lower: max(0, min(length, r.lowerBound)), upper: min(length, max(0, r.upperBound))))
          let start = index(startIndex, offsetBy: range.lowerBound)
          let end = index(start, offsetBy: range.upperBound - range.lowerBound)
          return String(self[start ..< end])
      }
      
      func toRange(_ range: NSRange) -> Range<String.Index>? {
          guard let from16 = utf16.index(utf16.startIndex, offsetBy: range.location, limitedBy: utf16.endIndex) else { return nil }
          guard let to16 = utf16.index(from16, offsetBy: range.length, limitedBy: utf16.endIndex) else { return nil }
          guard let from = String.Index(from16, within: self) else { return nil }
          guard let to = String.Index(to16, within: self) else { return nil }
          return from ..< to
      }
      
      
      func checkVersion(_ newVersion: String) -> Bool {
          return self.compare(newVersion, options: .numeric) == .orderedAscending
      }
      
  }