我知道我需要离开Swift 2,但我95%并认为我会在转换之前完成。
我正在制作音乐播放器。我有一个一维的persistentIDs数组(UInt64),我将在后面存储和读取。我可以使用每一个找到相应的albumTitle并将它们存储在一维数组(String)中。我的目标是按顺序组合它们,然后按albumTitle对它们进行排序。之后我想提取现在使用不同顺序的persistentID。
var array1: [UInt64] = [UInt64]() // Ex: [1, 2, 3, 4, 5]
var array2: [String] = [String]() // Ex: [d, a, e, b, c]
var array2D:[(UInt64, String)] = []
// Unsorted 2D array ex: [[1,d], [2,a], [3,e], [4,b], [5,c]]
// Sorted 2D array ex: [[2,a], [4,b], [5,c], [1,d], [3,e]]
// Final 1D array ex: [2, 4, 5, 1, 3]
我无法创建未排序的2D数组。我在这个网站上找到了以下代码,并认为我可以尝试对其进行调整,但不断得到错误:预期'{'启动for-each循环的主体
var N: Int
var array: [[Int]] = []
for row in 0..<N {
// Append an empty row.
array.append([Int]())
for _ in 0..<N {
// Populate the row.
array[row].append(Int(arc4random_uniform(100)))
}
}
我花了一天的时间来试图解决这个问题。
提前致谢!
答案 0 :(得分:2)
创建2D数组
let array1: [UInt64] = [1, 2, 3, 4, 5]
let array2: [String] = ["d", "a", "e", "b", "c"]
var array2D = Array(zip(array1, array2))
print(array2D); // [(1,"d"), (2,"a"), (3,"e"), (4,"b"), (5,"c")]
排序方法
array2D.sort { $0.1 < $1.1 }
print(array2D); // [(2, "a"), (4, "b"), (5, "c"), (1, "d"), (3, "e")]
答案 1 :(得分:1)
这将为您提供“未排序的数组”:
var array1: [UInt64] = [1, 2, 3, 4, 5]
var array2: [String] = ["d", "a", "e", "b", "c"]
var array2D = Array(zip(array1, array2)) // [(1,"d"), (2,"a"), (3,"e"), (4,"b"), (5,"c")]
不是说这不是二维数组。它仍然是一个2元组的一维数组。
“排序数组”的含义不明确
答案 2 :(得分:1)
首先。在Swift 2中,数组在存储内容方面比字典更有效,因此限制了性能平衡的选择。 Swift 3在此方面做出了重大改进,缩小了性能差距。 正因为如此:正如之前的帖子所指出的,你的2D数组只不过是一个由两个元组组成的数组。这带来了以下问题:您必须检查2D数组中每个1D数组的每个元素的类型,以了解哪个值是id和标题。您的2D数组可以简单地制作成一个字典/对象数组。这是你应该从一开始就做的事情:使用一个可以追踪事物的类,以便于操作。这可以避免您的问题混淆,这可能发生在本地存储然后再检索。请注意,这适用于中小型列表,否则,您需要更好的逻辑或更大的列表的不同方法。但是,像这样的东西总是很好地开始:
class Track {
var id : UInt64
var title : String
init(id: UInt64, title: String) {
self.id = id
self.title = title
}
}
class Playlist {
var name = String()
var playlistId : UInt64?
var tracks : [Track] = []
private var indexes : [String:Int] = [:]
private var idList : [UInt64:String] = [:]
init(name: String, tracks: [Track]?) {
self.name = name
if let t = tracks {
for track in t {
addSongWithoutOrdering(track)
}
orderSongs()
}
}
private func addSongWithoutOrdering(_ song: Track) {
tracks.append(song)
}
func addSong(_ track: Track) {
tracks.append(track)
orderSongs()
print("Added song titled: \(track.title) to playlist : \(name)")
}
func removeSongBy(_ id: UInt64) {
if let title = idList[id], let index = indexes[title] {
idList.removeValue(forKey: id)
indexes.removeValue(forKey: title)
tracks.remove(at: index)
orderSongs()
} else {
print("No song with id: \(id) exists in playlist : \(name)")
}
}
func removeSongBy(_ title: String) {
if let index = indexes[title] {
idList.removeValue(forKey: tracks[index].id)
indexes.removeValue(forKey: title)
tracks.remove(at: index)
orderSongs()
} else {
print("Removed song with title: \(title) in playlist : \(name)")
}
}
private func orderSongs () {
tracks.sort { $0.title < $1.title }
for (index, track) in tracks.enumerated() {
indexes[track.title] = index
idList[track.id] = track.title
}
}
}
通过执行此操作,您还可以将播放列表,播放列表组等排序。如果你不能立即访问它们,你也可以制作一些值选项(即,它们需要从API获取)。
Conlusion:跳转到Swift 3,或采用类似上面的类!