有趣的
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当中!
-
快速掌握一门语言,比如Swift,勤加练习算法无疑是最好的方式!
-
在此之前,如果你不熟悉Array有哪些内置函数,不妨去看看 文档