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