К вашему точному вопросу, да, это возможно.Это невероятно маловероятно, что вы захотите сделать это, но это возможно, если вы поместите это в подкласс NSObject
и отметите все как @objc
, тогда вы можете использовать Кодирование значения ключа :
import Foundation
class League: NSObject {
@objc var team1: Int = 0 // Fun-fact: If you fail to include @objc here
@objc var team2: Int = 0 // it will compile fine, but it'll crash later.
@objc var team3: Int = 0 // Using the ObjC runtime takes away many of the
@objc var team4: Int = 0 // compiler protections that Swift offers.
// This is an advanced technique that should almost never be used in Swift
func addPointsToTeam(number: Int) {
let key = "team\(number)"
let oldValue = value(forKey: key) as! Int
setValue(oldValue + 1, forKey: key)
}
}
let league = League()
league.addPointsToTeam(number: 1)
Но использование KVC и встроенных селекторов почти наверняка не тот инструмент, который вам нужен.Даже в ObjC, где обычно используется KVC, селекторы ручной сборки, подобные этому, встречаются редко и опасны и обычно используются только для продвинутых инструментов.
Требуемый инструмент представляет собой массив.Не используйте четыре переменные, когда вы имеете в виду список.Используйте одну переменную:
var teamScores = [0, 0, 0, 0]
func addPointsToTeam(number: Int) {
teamScores[number] += 1
}
Очень быстро вы обнаружите, что у вас есть несколько параллельных массивов, таких как teamScores
и teamNames
.В этот момент вы должны снова исправить ваши данные.Как и прежде, не используйте несколько переменных, когда вы имеете в виду одну:
struct Team {
let name: String
var score: Int
}
var teams = [Team(name: "Alices", score: 0), Team(name: "Bobs", score: 0)]
func addPointsToTeam(number: Int) {
teams[number].score += 1
}
Обратите внимание, что массивы имеют индекс 0.Поэтому, если вы хотите выстроить строку с «1, 2, 3, 4», вам нужно будет вычесть или добавить ее по мере необходимости.