本文将演示对基本类型: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 = "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 }