1. 程式人生 > >[Swift通天遁地]五、高階擴充套件-(6)對基本型別:Int、String、Array、Dictionary、Date的擴充套件

[Swift通天遁地]五、高階擴充套件-(6)對基本型別:Int、String、Array、Dictionary、Date的擴充套件

本文將演示對基本型別:Int、String、Array、Dictionary、Date的擴充套件。

首先確保在專案中已經安裝了所需的第三方庫。

點選【Podfile】,檢視安裝配置檔案。

1 platform :ios, '12.0'
2 use_frameworks!
3 
4 target 'DemoApp' do
5     source 'https://github.com/CocoaPods/Specs.git'
6     pod 'EZSwiftExtensions'
7 end

根據配置檔案中的相關配置,安裝第三方庫。

然後點選開啟【DemoApp.xcworkspace】專案檔案。

在專案導航區,開啟檢視控制器的程式碼檔案【ViewController.swift】

現在開始編寫程式碼,對基本型別:Int、String、Array、Dictionary、Date擴充套件。

  1 import UIKit
  2 //在當前的類檔案中,引入已經安裝的第三方類庫
  3 import EZSwiftExtensions
  4 
  5 class ViewController: UIViewController {
  6 
  7     override func viewDidLoad() {
  8         super.viewDidLoad()
9 // Do any additional setup after loading the view, typically from a nib. 10 11 //獲得裝置的各種資訊 12 eZFunctions() 13 //對檢視控制器和其他基本型別進行擴充套件 14 extensionExample() 15 //字串相關的擴充套件方法 16 stringExamples() 17 //可變字串(NSAttributedString)相關的擴充套件方法
18 nSAttributedStringExtensions() 19 //陣列相關的擴充套件方法 20 arraryExtension() 21 //字典相關的擴充套件方法 22 dictionaryExample() 23 //用於日期相關的擴充套件方法 24 dateExample() 25 } 26 27 //新增一個方法,通過擴充套件方法獲得裝置的各種資訊 28 func eZFunctions() 29 { 30 //獲取版本號 31 print(ez.appVersion!) 32 //獲取編譯號 33 print(ez.appBuild!) 34 print(ez.appVersionAndBuild!) 35 36 //檢測裝置是否處於豎立狀態 37 if ez.screenOrientation.isPortrait 38 { 39 print("Screen orientation is portrait") 40 } 41 else 42 { 43 //檢測裝置是否處於橫放狀態 44 print("Screen orientation is not portrait") 45 } 46 47 //輸出螢幕寬度 48 print(ez.screenWidth) 49 //輸出螢幕高度 50 print(ez.screenHeight) 51 52 //輸出狀態列的高度 53 print(ez.screenStatusBarHeight) 54 //輸出螢幕不包含狀態列的高度 55 print(ez.screenHeightWithoutStatusBar) 56 57 //第三方庫還提供了一個快速下載網路圖片的方法 58 ez.requestImage("http://images.apple.com/v/apple-watch-nike/a/images/overview/features_large.jpg") 59 { 60 (image) -> Void in 61 //網路圖片下載完成之後,跳轉到主執行緒,並顯示下載後的圖片 62 ez.runThisInMainThread { () -> Void in 63 //建立一個影象檢視,用來顯示下載的網路圖片 64 let myImageView = UIImageView(image: image) 65 //並將影象檢視新增到根檢視 66 self.view.addSubview(myImageView) 67 } 68 } 69 70 //第三方庫對多執行緒提供了很好的支援,使開發者可以很方便的建立一個新的執行緒。 71 ez.runThisInBackground { () -> () in 72 print("Runs this in default priority queue") 73 } 74 75 //通過獲取JSON的方法,可以訪問伺服器的介面,並處理從伺服器返回的資料。 76 ez.requestJSON("http://www.runoob.com/try/angularjs/data/sites.php", success: 77 { (object) -> Void in 78 print(object ?? "") 79 }) 80 //處理伺服器介面返回失敗的情況 81 { (error) -> Void in 82 print(error) 83 } 84 } 85 86 //新增一個方法,對檢視控制器和其他基本型別進行擴充套件 87 func extensionExample() 88 { 89 //初始化 一個檢視控制器物件 90 let vc = UIViewController() 91 //在控制檯輸出檢視控制器物件的類名 92 print("vc.className:\(vc.className)") 93 //輸出類的名稱字串 94 print("UIViewController.className:\(UIViewController.className)") 95 96 //初始化一個布林遍歷 97 var myBool: Bool = true 98 //通過布林型別的擴充套件方法,反轉布林變數的值 99 print("myBool.toggle():\(myBool.toggle())") 100 101 //初始化一個整形常量 102 let myNumber = -33 103 //通過擴充套件屬性,檢測是否為偶數 104 print("myNumber.isEven:\(myNumber.isEven)") 105 //通過擴充套件屬性,檢測是否為奇數 106 print("myNumber.isOdd:\(myNumber.isOdd)") 107 //通過擴充套件屬性,檢測是否為正數 108 print("myNumber.isPositive:\(myNumber.isPositive)") 109 //通過擴充套件屬性,檢測是否為負數 110 print("myNumber.isNegative:\(myNumber.isNegative)") 111 //獲得並輸出某個整數的數字個數 112 print("myNumber.digits:\(myNumber.digits)") 113 114 //通過數字型別的範圍屬性,可以快速建立一個迴圈 115 for index in 5.range 116 { 117 print("index:\(index)") 118 } 119 120 //初始化一個無符號的整數 121 let someUInt: UInt = 3 122 //將其轉化為整數 123 let myInt = someUInt.toInt 124 125 //整數轉換為雙精度 126 print("myInt.toDouble:\(myInt.toDouble)") 127 //整數轉換為浮點 128 print("myInt.toFloat:\(myInt.toFloat)") 129 //整數轉換為CGFloat 130 //需要相容64位機器的程式而言,需要用CGFloat, 131 print("myInt.toCGFloat:\(myInt.toCGFloat)") 132 //整數轉換為字串 133 print("myInt.toString:\(myInt.toString)") 134 //整數轉換為無符號整形 135 print("myInt.toUInt:\(myInt.toUInt)") 136 } 137 138 //新增一個方法,用於字串相關的擴充套件方法 139 func stringExamples() 140 { 141 //初始化一個內容為數字的字串 142 var myString = "33.3" 143 //轉化為Double型別 144 print("myString.toDouble:\(myString.toDouble)") 145 //轉化為Int型別 146 print("myString.toInt:\(myString.toInt)") 147 148 //刪除字串中的空格和換行符 149 myString.trim() 150 //在控制檯輸出 151 print("myString:\(myString)") 152 153 //初始化另一個字串常量 154 let eZSwiftExtensions = "eZSwiftExtensions" 155 //輸出在字串中指定位數的字元 156 print("eZSwiftExtensions[2]:\(eZSwiftExtensions[2])") 157 print("eZSwiftExtensions[3]:\(eZSwiftExtensions[3])") 158 //輸出在字串中指定範圍的字元 159 print("eZSwiftExtensions[2...4]:\(eZSwiftExtensions[2...4])") 160 //獲得某個字元在另一個字串中的位置 161 print("eZSwiftExtensions.getIndexOf(w):\(eZSwiftExtensions.getIndexOf("w") ?? 0)") 162 163 //初始化另一個字串常量 164 let awesomeString = "eZSwiftExtensions is awesome!" 165 //獲得並輸出字串的長度 166 print("awesomeString.length:\(awesomeString.length)") 167 //輸出首字母大寫的字串 168 print("awesomeString.capitalized:\(awesomeString.capitalized)") 169 170 //初始化另一個字串常量 171 let awesomeString2 = "eZSwiftExtensions is awesome!" 172 //在字串中是否包含三個字串 173 print("awesomeString2.contains(squirtle):\(awesomeString2.contains("squirtle"))") 174 print("awesomeString2.contains(awesome):\(awesomeString2.contains("awesome"))") 175 print("awesomeString2.contains(AWESOME):\(awesomeString2.contains("AWESOME"))") 176 //設定相關的選項,對是否包含字串進行檢測 177 //這裡設定在檢測字元時,考慮大小寫的不同 178 print(awesomeString2.contains("AWESOME", compareOption: NSString.CompareOptions.caseInsensitive)) 179 180 //建立兩個字串常量 181 let awesomeString3 = "\n eZSwiftExtensions is awesome! \n \n " 182 let emptyStr = " \n \n \n" 183 184 //檢測字串是否為空 185 print("awesomeString3.isBlank:\(awesomeString3.isBlank)") 186 print("emptyStr.isBlank:\(emptyStr.isBlank)") 187 188 let awesomeString4 = "eZSwiftExtensions is awesome!" 189 let emailStr = "[email protected]" 190 //檢測字串是否為郵箱格式 191 print("awesomeString4.isEmail:\(awesomeString4.isEmail)") 192 print("emailStr.isEmail:\(emailStr.isEmail)") 193 194 //建立一個字串常量 195 let urlString = "http://www.google.com is great but www.bd.com not that much" 196 //通過抽取網址列表方法,可以抽取字串中的所有網址 197 print("myString.extractURLs:\(myString.extractURLs)") 198 print("emailStr.extractURLs:\(emailStr.extractURLs)") 199 print("urlString.extractURLs:\(urlString.extractURLs)") 200 201 //建立一個字串常量 202 let myNumberString = "13" 203 //將字串轉換為相應型別 204 print("myNumberString.toInt():\(String(describing: myNumberString.toInt()))") 205 print("myNumberString.toDouble():\(String(describing: myNumberString.toDouble()))") 206 print("myNumberString.toFloat():\(String(describing: myNumberString.toFloat()))") 207 208 //建立兩個字串常量 209 let myBoolString = "false" 210 let myOtherString = "hello" 211 //將字串轉換為布林型別 212 print("myBoolString.toBool():\(String(describing: myBoolString.toBool()))") 213 print("myOtherString.toBool():\(String(describing: myOtherString.toBool()))") 214 215 //建立兩個字串常量 216 let myStr = "10.5" 217 let myOtherStr = "Legolas" 218 //判斷字串是否完全由數字組成 219 print("myStr.isNumber():\(myStr.isNumber())") 220 print("myOtherStr.isNumber():\(myOtherStr.isNumber())") 221 222 //初始化一個較長的字串 223 let str = "Like all Apple Watch Series 2 models, Apple Watch Nike+ has built-in GPS to track your pace, distance, and route — even if you don’t have your iPhone with you. With the brightest display Apple has ever made, your metrics are easy to read, no matter how much the sun glares. And Apple Watch Nike+ is rated water resistant 50 meters,* so you can even take a post-run dip in the pool." 224 //統計在字串中,總共包含了多少個指定的字串 225 print("str.count:\(str.count("Watch"))") 226 } 227 228 //新增一個方法,可變字串(NSAttributedString)相關的擴充套件方法 229 func nSAttributedStringExtensions() 230 { 231 //初始化一個NSAttributedString常量 232 let str = NSAttributedString(string: "Like all Apple Watch Series 2 models, Apple Watch Nike+ has built-in GPS to track your pace, distance, and route — even if you don’t have your iPhone with you. With the brightest display Apple has ever made, your metrics are easy to read, no matter how much the sun glares. ") 233 234 //可變字串擁有多個擴充套件方法 235 var attrStr1 = str.underline()//下劃線 236 .bold()//加粗 237 .italic()//斜體 238 .color(.orange)//設定顏色為橙色 239 //設定自定義樣式的字元範圍 240 .attributedSubstring(from: NSRange(location: 0, length: 120)) 241 242 //可變字串擁有多個擴充套件方法 243 let attrStr2 = str.strikethrough()//新增中心線 244 //設定自定義樣式的字元範圍 245 .attributedSubstring(from: NSRange(location: 120, length: str.length-121)) 246 //將兩個可變字串進行拼接 247 attrStr1 += attrStr2 248 249 //初始化一個標籤物件,並設定標籤的顯示區域 250 let label = UILabel(frame: CGRect(x: 20, y: 40, width: 280, height: 200)) 251 //設定標籤物件可以顯示多行文字 252 label.numberOfLines = 0 253 //將可變字串賦予標籤物件 254 label.attributedText = attrStr1 255 //將標籤物件新增到根檢視 256 self.view.addSubview(label) 257 } 258 259 //新增一個方法,用於陣列相關的擴充套件方法 260 func arraryExtension() 261 { 262 //初始化一個數組物件,然後隨機獲得陣列中的一個元素 263 let myArray = ["charmander","bulbasaur","squirtle"] 264 print("myArray.random():\(String(describing: myArray.random()))") 265 266 //初始化一個數組物件,然後獲得某個元素在陣列中的索引位置 267 let myArray2 = ["charmander","bulbasaur","squirtle","charmander"] 268 print("myArray2.indexesOf(charmander):\(myArray2.indexesOf("charmander"))") 269 270 //初始化一個數組物件, 271 //假如某個陣列擁有多個相同的元素,獲得最後一個物件所在的索引位置 272 let myArray3 = ["charmander","bulbasaur","squirtle","charmander"] 273 print("myArray3.lastIndexOf(charmander):\(String(describing: myArray3.lastIndexOf("charmander")))") 274 275 //初始化一個數組物件,刪除陣列中的指定元素 276 var myArray4 = ["charmander","bulbasaur","squirtle"] 277 myArray4.removeObject("charmander") 278 print("myArray4:\(myArray4)") 279 280 //初始化一個數組物件,判斷是否包含某個例項 281 let myArray5 = ["charmander","bulbasaur","squirtle"] 282 print("myArray5.containsInstanceOf:\(myArray5.containsInstanceOf("charmander"))") 283 print("myArray5.containsInstanceOf(1):\(myArray5.containsInstanceOf(1))") 284 285 //初始化一個數組物件,判斷是否包含另一個數組中的所有元素 286 let myArray6 = ["charmander","bulbasaur","squirtle"] 287 print("containsArray([charmander,bulbasaur]):\(myArray6.containsArray(["charmander","bulbasaur"]))") 288 //初始化一個數組物件,判斷是否包含另一個數組中的元素 289 print("myArray6.containsArray([string]):\(myArray6.containsArray(["string"]))") 290 291 //初始化一個數組物件,該陣列包含字串和整形兩種型別的元素 292 var myArray7 = ["charmander","bulbasaur","squirtle",1,2,3] as [Any] 293 //將陣列中的所有元素隨機排序。 294 //更改陣列中各位元素的位置。 295 myArray7.shuffle() 296 print("myArray7:\(myArray7)") 297 298 //初始化一個數組物件,將一個新的元素插入到陣列中的首位。 299 var myArray8 = ["charmander","bulbasaur","squirtle"] 300 myArray8.insertAsFirst("snorlax") 301 print("myArray8:\(myArray8)") 302 303 //初始化一個數組物件, 304 let myArray9 = ["charmander","bulbasaur","squirtle"] 305 //兩個陣列同時擁有的元素,交集 306 print("myArray9.intersection:\(myArray9.intersection(["charmander","pikachu","bulbasaur"]))") 307 //兩個元素的並集 308 print("myArray9.union:\(myArray9.union(["charmander","pikachu"]))") 309 310 //初始化一個數組物件,兩個陣列互不擁有的元素。 311 let myArray10 = ["charmander","bulbasaur","squirtle","pikachu"] 312 print("myArray10.difference:\(myArray10.difference(["charmander","bulbasaur"]))") 313 } 314 315 //新增一個方法,用於字典相關的擴充套件方法 316 func dictionaryExample() 317 { 318 //初始化一個字典物件,檢測在字典中是否包含指定的鍵 319 let myDict = ["charmander": "fire","bulbasaur": "grass","squirtle": "water"] 320 print("myDict.has(charmander):\(myDict.has("charmander"))") 321 print("myDict.has(pikachu):\(myDict.has("pikachu"))") 322 323 //初始化一個字典物件,將字典中的鍵值隨機分佈 324 let myDict2 = ["charmander": "fire","bulbasaur": "grass","squirtle": "water"] 325 print("myDict2.random():\(myDict2.random())") 326 327 //初始化另外兩個字典物件 328 var dict1 = ["charmander" : "fire"] 329 let dict2 = ["squirtle" : "water"] 330 331 //初始化一個字典物件,拼接兩個字典物件 332 dict1 += dict2 333 print("dict1:\(dict1)") 334 335 //初始化另外兩個字典物件 336 let dictionary1 = ["charmander" : "fire", "bulbasaur" : "grass"] 337 let dictionary2 = ["charmander": "fire","squirtle": "water"] 338 339 //兩個字典物件的交集 340 var dictionary3 = dictionary1.intersection(dictionary2) 341 print("dictionary3:\(dictionary3)") 342 343 //兩個字典物件的並集 344 dictionary3 = dictionary1.union(dictionary2) 345 print("dictionary3:\(dictionary3)") 346 //兩個字典物件的補集 347 print("dictionary1.difference:\(dictionary1.difference(dictionary1, dictionary2))") 348 } 349 350 //新增一個方法,用於日期相關的擴充套件方法 351 func dateExample() 352 { 353 //初始化兩個字串物件,分別標識日期的格式、日期的值 354 let format = "yyyy/MM/dd" 355 let fromString = "2016/01/11" 356 //輸出格式化後的日期 357 print("Date(fromString: fromString, format: format):\(String(describing: Date(fromString: fromString, format: format)))") 358 359 //初始化一個日期物件 360 let now = Date() 361 //輸出日期物件轉換成字串後的內容 362 print("now.toString():\(now.toString())") 363 //通過設定日期和時間格式,可以將日期物件轉換成指定格式的日期和時間。 364 //日期格式共有五種:無、短、中、長、全 365 print("now.toString(dateStyle: .medium, timeStyle: .medium):\(now.toString(dateStyle: .medium, timeStyle: .medium))") 366 //使用字串設定日期和時間的格式, 367 //然後將日期轉換成指定格式的內容。 368 print("now.toString(format:yyyy/MM/dd HH:mm:ss):\(now.toString(format: "yyyy/MM/dd HH:mm:ss"))") 369 370 //初始化另外兩個日期物件 371 let now2 = Date() 372 let later = Date(timeIntervalSinceNow: -100000) 373 //計算兩個日期之間相差的: 374 //天數 375 print("later.daysInBetweenDate(now2):\(later.daysInBetweenDate(now2))") 376 //小時數 377 print("later.hoursInBetweenDate(now2):\(later.hoursInBetweenDate(now2))") 378 //分鐘數 379 print("later.minutesInBetweenDate(now2):\(later.minutesInBetweenDate(now2))") 380 //秒數 381 print("later.secondsInBetweenDate(now2):\(later.secondsInBetweenDate(now2))") 382 383 //初始化另一個日期物件, 384 //然後計算該日期距離當前時間已經走過的長度 385 let date1 = Date(timeIntervalSinceNow: -100000) 386 print("date1.timePassed():\(date1.timePassed())") 387 388 //初始化另一個日期,並計算時間的流逝 389 let date2 = Date(timeIntervalSinceNow: -10000) 390 print("date2.timePassed():\(date2.timePassed())") 391 392 //計算第三個日期的時間流逝 393 let date3 = Date(timeIntervalSinceNow: -1000) 394 print("date3.timePassed():\(date3.timePassed())") 395 396 //初始化另外兩個日期物件 397 let now3 = Date() 398 let now4 = Date() 399 400 //使用數學符號快速比較兩個日期的大小。 401 print("now3 == now4:\(now3 == now4)") 402 print("now3 < now4:\(now3 < now4)") 403 print("now3 < now4:\(now3 < now4)") 404 405 //通過時間類可以快速建立延遲動作 406 //在此建立一個延遲兩秒,然後在“主執行緒”執行的動作。 407 Timer.runThisAfterDelay(seconds: 2) 408 { () -> () in 409 print("Prints this 2 seconds later in main queue") 410 } 411 412 //在此建立一個延遲兩秒,然後在“子執行緒”執行的動作。 413 Timer.runThisAfterDelay(seconds: 2, queue: DispatchQueue.global()) 414 { () -> () in 415 print("Prints this 2 seconds later") 416 } 417 } 418 419 override func didReceiveMemoryWarning() { 420 super.didReceiveMemoryWarning() 421 // Dispose of any resources that can be recreated. 422 } 423 }