★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公衆號:山青詠芝(shanqingyongzhi)
➤博客園地址:山青詠芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:http://www.javashuo.com/article/p-hrkoosud-ky.html
➤若是連接不是山青詠芝的博客園地址,則多是爬取做者的文章。
➤原文已修改更新!強烈建議點擊原文地址閱讀!支持做者!支持原創!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★php
目錄:[Swift]通天遁地Swifthtml
本文將演示對基本類型:Int、String、Array、Dictionary、Date的擴展。ios
首先確保在項目中已經安裝了所需的第三方庫。git
點擊【Podfile】,查看安裝配置文件。angularjs
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
根據配置文件中的相關配置,安裝第三方庫。github
而後點擊打開【DemoApp.xcworkspace】項目文件。swift
在項目導航區,打開視圖控制器的代碼文件【ViewController.swift】api
如今開始編寫代碼,對基本類型: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 = "charmander@gmail.com" 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 }