簡體   English   中英

在Swift中使用具有不同數據類型的數組

[英]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]()

在這里為您的問題提供多種解決方案

1.使用協議

您可以使JSONTrackTrack符合名為TrackProtocol的協議,例如具有通用方法名稱。 然后,您可以無縫地操作TrackProtocol數組。

最佳解決方案

2.使用一個枚舉

創建一個包含兩者的TrackEnum枚舉。

enum TrackEnum {
    case json(JSONTrack)
    case coreData(Track)
}

然后,您的數組就是TrackEnum數組,並且每次提取時都提取它。

3.使用任何

您可以做一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM