有趣的 Swift 3 算法。

Youtube上看到Swift3 的一个小算法,觉得很有趣!介绍给大家~

应用场景

现在打开网易云音乐,选取一个歌单打开,从中选取一首歌,点击播放。若是循环模式,那么播放歌曲的顺序应该是:当前这首歌 -> 下面的所有歌 -> 当前这首歌上面的歌。
抽象出来就是: 对于数组["a", "b", "c", "d", "e"], 选取”c”,输出 [ "c", "d", "e", "a", "b"]

实现1

新建Playground,GeneratePlayList

// 假设我们有一个歌单tracks
let tracks = ["a", "b", "c", "d", "e"]

// 如果我们选择了"d",算法应该返回下面这个播放列表  
["d", "e", "a", "b", "c"]  

// 选中歌曲
let selectedTrack = "d"

// 新建播放列表
var playList = [String]()  

// 所选歌曲之前的歌曲列表
var priorTracks = [String]()

// for循环加入列表  
for track in tracks {
    print(track)
    if track == selectedTrack || playlist.count > 0{
        playlist.append(track)
    } else {
        priorTracks.append(track)
    }
}

playList
priorTracks

// 加在一起
playList + priorTracks

实现2

这次,不用for循环,利用Swift的Array的一些函数。2

这里联系应用场景,我们可能需要用的函数包括,找一个元素的index,获得子序列

// 假设我们有一个歌单tracks
let tracks = ["a", "b", "c", "d", "e"]

// 如果我们选择了"d",算法应该返回下面这个播放列表  
["d", "e", "a", "b", "c"]  

// 选中歌曲
let selectedTrack = "d"

// 这里可以用array的index的许多方法
let index = tracks.index(where: {return $0 == selectedTrack})

// 上面获得的index是可选值,因此需要强制解析
// upTo 左闭右开
let prefixArray = tracks.prefix(upTo: index!)
let suffixArray = tracks.suffix(from: index!)

// 最后注意组装的顺序
let arr = suffixArray + prefixArray

这里的index函数,声明是这样的:

func index(where predicate: (Element) throws -> Bool) rethrows -> Int?

where后面是一个闭包,以$0 表示一个参数,预测参数和传入的元素是否匹配,匹配则返回Int,否则返回nil,所以最终的返回值是可选值 Int?

希望这个小的算法1 可以运用到你的Application当中!

  1. 快速掌握一门语言,比如Swift,勤加练习算法无疑是最好的方式!

  2. 在此之前,如果你不熟悉Array有哪些内置函数,不妨去看看 文档