Функции Swift с числовыми переменными - PullRequest
0 голосов
/ 08 мая 2018

Если у меня 4 переменные:

var team1 = 0
var team2 = 0
var team3 = 0
var team4 = 0

Есть ли способ написать функцию с вводом целого числа, которая позволит мне сделать что-то вроде

func AddPointsToTeam(TeamNumber: Int) {
 TeamX += 1
}

Я знаю, что мог бы сделать это, используя массивы, и использовать входные данные в качестве индекса для массива, но есть ли способ сделать это таким образом?

Ответы [ 4 ]

0 голосов
/ 08 мая 2018

Одним из способов решения этой проблемы было бы использование перечисления для команды, чтобы было проще понять, как использовать функцию.

enum Team: Int {
  case team1 = 1
  case team2
  case team3
  case team4
}

struct TeamPoints {
  var team1 = 0
  var team2 = 0
  var team3 = 0
  var team4 = 0

  mutating func addPoint(forTeam team:Team) {
    switch team {
    case .team1:
      team1 += 1
    case .team2:
      team2 += 1
    case .team3:
      team3 += 1
    case .team4:
      team3 += 1
    }
  }
}
0 голосов
/ 08 мая 2018

Используйте случай верблюда, когда вы создаете свои функции в быстром, то же самое для переменных.

Вы вводите параметр in-out, помещая ключевое слово inout непосредственно перед типом параметра. Параметр in-out имеет значение, которое передается в функцию, модифицируется функцией и передается обратно из функции для замены исходного значения.

func addPointsToTeam(_ teamNumber: inout Int) {
   teamNumber += 1
}
0 голосов
/ 08 мая 2018

К вашему точному вопросу, да, это возможно.Это невероятно маловероятно, что вы захотите сделать это, но это возможно, если вы поместите это в подкласс 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», вам нужно будет вычесть или добавить ее по мере необходимости.

0 голосов
/ 08 мая 2018

Трудно сказать, потому что не ясно, что именно вы хотите делать ... или что вы ожидаете.

Например, я использовал словари.

var teamsDictionary:[String:Int] = ["team1":0,"team2":0,"team3":0,"team4":0]

print("Count of Team 1: \(teamsDictionary["team1"])") //prints 0
teamsDictionary["team1"] = 4
print("Count of Team 1: \(teamsDictionary["team1"])") //prints 4

Также вы можете использовать Sets или Arrays.Загляните в документацию, чтобы получить вдохновение https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/CollectionTypes.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...