Создание массива структуры без дубликатов - PullRequest
0 голосов
/ 03 апреля 2019

Недавно начал изучать Swift и теперь столкнулся с проблемой (код ниже вставит):

Я создаю массив структур из 3 массивов.При создании экземпляра структуры мне нужно сделать это случайно (randomElement, как я понял) - все 3 параметра должны быть уникальными.Как проверить уникальность в функции?

arrayOfHumans = createRandomHuman()

struct Human {
    let name: String
    let surname: String
    let age: String
    var email: String
}

var arrayOfHumans = [Human] () 
var humans: [Human] = []

let nameA  = ["Tim", "Mike", "Stan"]
let surnameA = ["Burk", "Sims", "Stoch"]
let ageA = ["12", "30", "25"]
let emailA = ["one@live.com", "two@gmail.com", "three@outlook.com"]

func createRandomHuman() -> [Human] {
    for _ in 1...3 {
        if nameA.isEmpty == false {
            let human = Human(name: nameA.randomElement()!,
                            surname: surnameA.randomElement()!,
                            age: ageA.randomElement()!,
                            email: emailA.randomElement()!)
            humans.append(human)
        }
    }
    return humans
}

Фактический результат:

first Struct {
    name: Tim
    surname: Sims
    age: 12
    email: three@outlook.com
}

second Struct {
    name: Mike
    surname: Stoch
    age: 25
    email: one@live.com
}

third Struct {
    name: Stan
    surname: Burk
    age: 30
    email: two@gmail.com
}

Ответы [ 2 ]

0 голосов
/ 03 апреля 2019

Если я вас правильно понимаю, вы хотите убедиться, что все случайно созданные люди разные.
Если так, вопрос в том, когда 2 человека разные. Это зависит от вашей проблемы. Таким образом, вы, как программист, должны определить это.
Вы можете сделать это, приняв протокол Equatable .
Как только ваши структуры соответствуют этому протоколу, вы можете перебрать всех ранее инициированных людей и проверить, равен ли новый случайно созданный человек одному из них. Если это так, создайте новый.

0 голосов
/ 03 апреля 2019

Решением является shuffle массива фамилии, возраста и адреса электронной почты отдельно для получения случайного, но уникального заказа.

let nameA  = ["Tim", "Mike", "Stan"]
let surnameA = ["Burk", "Sims", "Stoch"]
let ageA = ["12", "30", "25"]
let emailA = ["one@live.com", "two@gmail.com", "three@outlook.com"]

func createRandomHuman() -> [Human] {
    let shuffledSurnameA = surnameA.shuffled()
    let shuffledAgeA = ageA.shuffled()
    let shuffledEmailA = emailA.shuffled()
    var humans: [Human] = []
    for i in 0..<nameA.count {
        let human = Human(name: nameA[i],
                          surname: shuffledSurnameA[i],
                          age: shuffledAgeA[i],
                          email: shuffledEmailA[i])
            humans.append(human)
    }
    return humans
}

let arrayOfHumans = createRandomHuman()

Другой способ - перетасовать индексы

func createRandomHuman() -> [Human] {
    let indices = nameA.indices
    let shuffledIndices = (0..<3).map{ _ in indices.shuffled()}
    var humans: [Human] = []
    for i in 0..<nameA.count {
        let human = Human(name: nameA[i],
                          surname: surnameA[shuffledIndices[0][i]],
                          age: ageA[shuffledIndices[1][i]],
                          email: emailA[shuffledIndices[2][i]])
        humans.append(human)
    }
    return humans
}
...