[英]Working with array with different data types in Swift
我正在开发一个能够播放歌曲播放列表的音乐应用程序,我的项目中有两种表示歌曲的数据类型; “ Track”是NSManagedObject的用户存储在设备上的歌曲,“ JSONTrack”是代表可从json网络服务解码的歌曲。 用户应该能够将这两种类型添加到播放列表数组中。 如何使用Swift实现此目的,为不同的数据类型创建一个数组并在该数组上工作:当前处理一种数据类型的代码如下所示:
var playlistTracks = [Track]()
@objc fileprivate func handlePrevTrack() {
if playlistTracks.isEmpty {
return
}
let currentTrackIndex = playlistTracks.index { (tr) -> Bool in
return self.track?.trackTitle == tr.trackTitle && self.track?.albumTitle == tr.albumTitle
}
guard let index = currentTrackIndex else { return }
let prevTrack: Track
if index == 0 {
let count = playlistTracks.count
prevTrack = playlistTracks[count - 1]
} else {
prevTrack = playlistTracks[index - 1]
}
self.track = prevTrack
}
@objc func handleNextTrack() {
if playlistTracks.count == 0 {
return
}
let currentTrackIndex = playlistTracks.index { (tr) -> Bool in
return self.track?.trackTitle == tr.trackTitle && self.track?.albumTitle == tr.albumTitle
}
guard let index = currentTrackIndex else { return }
let nextTrack: Track
if index == playlistTracks.count - 1 {
nextTrack = playlistTracks[0]
} else {
nextTrack = playlistTracks[index + 1]
}
self.track = nextTrack
}
处理下一个和上一个选择。 我想对由两种不同数据类型表示的两种不同类型的歌曲执行相同的操作。
使用具有下一个和上一个操作所需的方法/属性的协议。 让两种轨道类型都实现该协议。 让您的阵列具有协议的类型。
protocol Track {
title: String
albumTitle: String
// other method and properties
}
class JSONTrack: Track {
// implementation
}
class CoreDataTrack: Track {
// implementation
}
let tracks = [Track]()
在这里为您的问题提供多种解决方案
您可以使JSONTrack
和Track
符合名为TrackProtocol
的协议,例如具有通用方法名称。 然后,您可以无缝地操作TrackProtocol
数组。
最佳解决方案
创建一个包含两者的TrackEnum
枚举。
enum TrackEnum {
case json(JSONTrack)
case coreData(Track)
}
然后,您的数组就是TrackEnum
数组,并且每次提取时都提取它。
您可以做一个Any
数组,并在运行时检查内容类型。
最糟糕的解决方案。
使用协议可能是最常见的方法,但enum
也可以正常工作。
要详细说明enum
选项:
class JSONTrack: NSObject {}
class OtherTrack: NSObject {}
enum Track {
case jsonTrack(JSONTrack)
case otherTrack(OtherTrack)
// enum can be handy if you want to do type checking
// and e.g. present specific data for that type
var label: String {
switch self {
case .jsonTrack:
return "Json track"
case .otherTrack:
return "Other track"
}
}
}
let jsonTrack = JSONTrack()
let otherTrack = OtherTrack()
let tracks: [Track] = [Track.jsonTrack(jsonTrack), Track.otherTrack(otherTrack)]
let labelOfTrack1 = tracks.first!.label
print(labelOfTrack1)
// prints "Json track"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.