Struct和Class的區(qū)別
- Struct是值類型,存儲(chǔ)于棧區(qū),所以少量?jī)?nèi)存用結(jié)構(gòu)體
- Class是引用類型,存儲(chǔ)于堆區(qū),大量數(shù)據(jù)用類
怎么選取Class還是Struct呢?
- 內(nèi)存選取
- 賦值機(jī)制用的KVO,KVC,選取類繼承與NSObject
- 是否考慮繼承關(guān)系
創(chuàng)建Player的結(jié)構(gòu)體**
struct Player {
var name: String
var hignScore: Int = 0
var history: [Int] = []
init(_ name: String) {
self.name = name
}
}
var player = Player("Tomas")
給Player新增一個(gè)方法
extension Player {
mutating func updateScore(_ newScore: Int) {
history.append(newScore)
if hignScore < newScore {
print("\(newScore)! A new high score for \(name)!??")
hignScore = newScore
}
}
}
player.updateScore(50)
//50! A new high score for Tomas!??
實(shí)現(xiàn)codable和equatable方法
extension Player: Codable, Equatable {
}
let encoder = JSONEncoder()
try! encoder.encode(player)
print(player)
//Player(name: "Tomas", hignScore: 50, history: [50])
條件擴(kuò)展:只有是Player結(jié)構(gòu)體的數(shù)組 才增加這個(gè)方法
extension Collection where Element == Player {
func highestScoringPlayer() -> Player? {
return self.max(by: { $0.hignScore < $1.hignScore })
}
}
//使用
let players = getPlayers()
let ranked = players.sorted { (player1, player2) -> Bool in
player1.hignScore > player2.hignScore
}
let rankedNames = ranked.map { $0.name }
print(rankedNames)
var recordHolder = ""
if let bestPlayer = players.highestScoringPlayer() {
recordHolder = """
The record holder is \(bestPlayer.name),\
with a high score of \(bestPlayer.hignScore)!
"""
} else {
recordHolder = "No games have been played yet."
}
print(recordHolder)
let highestScore = players.highestScoringPlayer()?.hignScore ?? 0
print(highestScore)
//獲取方法
func getPlayers() -> [Player] {
var players = [Player]()
var player = Player("Tomas")
player.updateScore(50)
players.append(player)
var player1 = Player("Shlly")
player1.updateScore(80)
players.append(player1)
return players
}