如何在 Swift 2 中用 2 个 1 维数组制作二维数组



我知道我需要离开 Swift 2,但我是 95%,并认为我会在转换之前完成。

我正在开发音乐播放器。 我有一个 persistentID (UInt64( 的一维数组,我稍后会存储和读取它。 我可以使用每个来查找它们相应的专辑标题,并将其存储在一维数组(字符串(中。 我的目标是按顺序组合它们,然后按专辑标题对它们进行排序。 之后,我想提取现在以不同顺序排列的持久 ID。

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)))
}
}

我花了一天的大部分时间试图弄清楚这一点。

提前感谢!

创建 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")]

这将为您提供"未排序的数组":

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 元组的一维数组。

您所说的"排序数组"尚不清楚

第一。在 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 获取它们(,您也可以将某些值设置为可选值。

结论:跳转到 Swift 3,或者采用上面这样的类!

最新更新