2017-07-03 64 views
0

我有一個結構從結構(SWIFT)

struct FavoriteSong { 

    var title: String 
    var artist: String 

    init(title : String, artist : String) { 
     self.title = title 
     self.artist = artist 
    } 

    init?(dictionary : [String:String]) { 
     guard let title = dictionary["title"], 
      let artist = dictionary["artist"] else { return nil } 
     self.init(title: title, artist: artist) 
    } 

    var propertyListRepresentation : [String:String] { 
     return ["title" : title, "artist" : artist] 
    } 
} 


var favoriteSongs: [FavoriteSong] = [ 

]; 

通過按下一個UIButton刪除項目,對象添加到結構

favoriteSongs.append(FavoriteSong(title: songs[thisSong].title, artist: songs[thisSong].artist)) 

但是,我想另一個UIButton去除對象來自結構。類似這樣的:

favoriteSongs.remove(FavoriteSong(title: songs[thisSong].title, artist: songs[thisSong].artist)) 

我正在使用UITableView來顯示信息。我將如何做到這一點?

+0

刪除哪個元素?你沒有提到應用程序擴展時它將如何工作。你爲一個結構解釋了它的例子,但是你想要移除哪個元素。你有這些集合視圖或tableview嗎?添加更多細節! –

+0

正如你將喜歡的歌曲存儲在一個'Array'中。所以你必須記住存儲歌曲的'index',然後你可以通過索引來刪除它。其他選項是通過'title'將它存儲在'Dictionary'中,然後你可以通過'title'鍵刪除fvrt歌曲。 –

+1

你可以使'FavoriteSong'符合'Equatable'協議,然後遍歷數組以找到使用== ==操作符的歌曲的潛在索引,如果找到了,將它從數組中移除。 – Sajjon

回答

0

查找對象的index並刪除它,你的歌titleartist

let index = favoriteSongs.index{ $0.title == songs[thisSong].title && $0.artist == songs[thisSong].artist} 
if let index = index { 
    favoriteSongs.remove(at: index) 
} 
0
struct FavoriteSong : Equatable{ 

public static func ==(lhs: FavoriteSong, rhs: FavoriteSong) -> Bool { 
    return lhs.title == rhs.title && 
      lhs.artist == rhs.artist 
    } 
} 

匹配,就必須擴展添加到Array使用刪除對象Equatable

extension Array where Element: Equatable { 

// Remove first collection element that is equal to the given `object`: 
mutating func remove(object: Element) { 
    if let index = index(of: object) { 
     remove(at: index) 
    } 
    } 
} 

而且那麼你可以使用這樣的東西

favoriteSongs.remove(FavoriteSong(title: songs[thisSong].title, artist: songs[thisSong].artist))