swift提供一个扩展特性(extension),能让你给已有的类型增加功能,可以用来扩展结构体、类、枚举。对类型的扩展支持以下几种能力:
给array扩展一个only属性,检查当前数组是否只有一个元素并返回这个数组元素:
//扩展一个only变量,只返回1个值的数组
extension Array{
//only为可选值
var only:Element? {
count == 1 ? first : nil //如果数组里只有1个值则返回当前值,否则返回空
}
}
使用方法:
//定义一个获取数组索引的计算属性
var onlyvar: Int?{
get{
//indices按升序对集合下标有效的索引。filter返回一个数组,按顺序包含序列中满足给定谓词的元素。
cards.indices.filter { cards[$0].isFaceUp }.only //only为扩展,只返回1个值的数组索引值
}
}
二、添加新的初始化方法。
三、使类型符合协议。
四、添加新方法。
1、Array 扩展一个查找索引值的功能,通过传入元素返回元素的索引值。
//扩展Array 条件:Identifiable可识别的
extension Array where Element:Identifiable{
//根据可识别数组里的ID去对比并返回当前的索引值(i)
func firstIndex(maching:Element) -> Int? {
for i in 0..<self.count{
if self[i].id == maching.id{
return i//找到第i个
}
}
return nil //没有找到相等的索引
}
}
使用方法:
if let choosenIndex = cards.firstIndex(maching:card){
print("找到被选中的卡片的索引是:", choosenIndex)
}else{
print("没有找到卡片")
}
2、Array数组随机排序
我们经常会使用到数组的排序功能,数组也自带了很多功能与属性(http://www.55mx.com/ios/102.html),但在实际开发中我们还需要对数组的功能扩展方便使用。
extension Array{
//让数组随机排序后返回
func shuffle() -> Array {
var list = self
for index in 0..<self.count {
/*
Cocoa 中有个arc4random()函数用来生成随机数且不需要种子,
但是这个函数生成的随机数范围比较大,需要用取模的算法对随机值进行限制。
这里使用Objective-C更方便的随机数函数arc4random_uniform(x)
用来产生0~(x-1)范围内的随机数,不需要再进行取模运算。
如果要生成1~x的随机数,可以这么写: arc4random_uniform(x)+1。
*/
let newIndex = Int(arc4random_uniform(UInt32(self.count-index))) + index
if index != newIndex {
list.swapAt(index, newIndex) //swapAt交换集合指定索引处的值。
}
}
return list
}
}
使用方法:
cards = cards.shuffle()//随机排序(自己扩展的)
五、添加嵌入类型。
除非注明,网络人的文章均为原创,转载请以链接形式标明本文地址:https://www.55mx.com/post/107
《【进阶篇】2 扩展(extension)的运用详解》的网友评论(0)