Могу ли я уменьшить количество дублированного кода Swift при передаче массива кортежей в функцию? - PullRequest
0 голосов
/ 28 мая 2020

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

С моими текущими знаниями Swift мне нужно объявить массив кортежей трижды подряд. Мне нужно объявить входные данные функции, объявить, что функция вернет, а также объявить пустой массив для добавления значений и возврата.

Это кажется довольно избыточным. Если я застрял в использовании кортежей, есть ли способ их переписать, чтобы мне не приходилось копировать и вставлять код три раза? , структуры или объекты вместо кортежей, но я еще не так далеко в Swift)

func findCleanAgents(agents: [(coverName: String, realName: String, accessLevel: Int, compromised: Bool)])
    -> [(coverName: String, realName: String, accessLevel: Int, compromised: Bool)] {
        var cleanAgents = [(coverName: String, realName: String, accessLevel: Int, compromised: Bool)]()
        for agent in agents {
            if agent.compromised == false {
                print("\(agent.coverName) isn't compromised.")
                cleanAgents.append(agent)
            }
        }
        return cleanAgents
}

1 Ответ

1 голос
/ 28 мая 2020

Вы можете использовать typealias, который назван в точности в честь того, что он делает: псевдоним для типа:

typealias AgentTuple = (coverName: String, realName: String, accessLevel: Int, compromised: Bool)

func findCleanAgents(agents: [AgentTuple]) -> [AgentTuple] {
  var cleanAgents: [AgentTuple] = []
  for agent in agents {
    if agent.compromised == false {
       print("\(agent.coverName) isn't compromised.")
       cleanAgents.append(agent)
    }
  }
}

Здесь документация Swift

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

В вашем случае, если эти четыре типа данных обычно go вместе, подумайте о создании нового типа:

struct Agent {
  var coverName: String
  var realName: String
  var accessLevel: Int
  var compromised: Bool
}

let agent = Agent(coverName: "Arlington Beech", realName: "James Bond", ...)
...