75142913在线留言
【进阶篇】2 扩展(extension)的运用详解_IOS开发_网络人

【进阶篇】2 扩展(extension)的运用详解

Kwok 发表于:2021-03-22 14:22:28 点击:1 评论: 0

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.neter8.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()//随机排序(自己扩展的)

五、添加嵌入类型。

 

 

除非注明,网络人的文章均为原创,转载请以链接形式标明本文地址:http://www.neter8.com/ios/107.html
标签:扩展Kwok最后编辑于:2021-04-13 09:13:37
0
感谢打赏!

《【进阶篇】2 扩展(extension)的运用详解》的网友评论(0)

本站推荐阅读

热门点击文章