Как автоматически генерировать объекты на основе классов iOS Swift - PullRequest
1 голос
/ 11 января 2020

извините, я не могу заставить фрагмент кода работать должным образом. Не знал, как заставить его распознавать Swift.

Моя проблема в том, что у меня есть класс с именем «Crewman», и я хочу сгенерировать 25 объектов на основе этого класса в функции «generateCrew». (В настоящее время я пытаюсь это сделать в файле тестирования в XCode). Я не знаю, как это исправить, чтобы все они назывались по-разному. Если я назначу объектам конкретное c имя, то оно будет просто перезаписывать первое в следующие 24 раза, когда я запускаю эту функцию.

Я очень новичок в iOS / Swift, поэтому хотел бы помочь ... особенно как ошарашен для меня насколько возможно хахахаха спасибо! : D

//This is the class constructor, if thats the right word...

class Crewman {
    var name: String!
    var navSkill: Int!      // #/10
    var combatSkill: Int!   // #/10
    var morale: Int!        // #/10
    var loyalty: Int!       // #/10
}


//This is where I am trying to create the objects within a function 

    var crewNames =
    ["Chance", "Bruno", "Toby", "Damien", "Rafael", "Domenic", "Weston", "Edison", "Chris", "Grant", "Cortez", "Darren", "Nicolas", "Everette", "Jason", "Vicente", "Noe", "Ricky", "Ivory", "Thomas", "Guillermo", "Isreal", "Ben", "Winfred", "Lincoln", "Kareem", "Antwan", "Greg", "Lawrence", "Corey", "Todd", "Jeffery", "Rayford", "Julio", "Manual", "Chi", "Bradford", "Devon", "Bryan", "Andreas", "Don", "Erik", "Bobbie", "Tyree", "Felipe", "Clifton", "Carrol", "Kasey", "Cliff", "Jack"]

    //Lincoln is no.25

    var crewmenAll = [Crewman]()

    func generateCrew()
    {
        for i in 1...25
        {
            var crewNames[i]:Crewman!
            crewmenAll.append(nameOfCrew)
            print(crewmenAll)
        }
    }

    override func setUp() {

        for i in 1...25
        {
            let x = Int.random(in: 0..<50)
            let name = crewNames[x]

            let navInt = Int.random(in: 3...7)
            let combatInt = Int.random(in: 3...7)
            let moraleInt = Int.random(in: 3...7)


            crewmenAll[i] = Crewman(name: name, navSkill: navInt, combatSkill: combatInt, morale: moraleInt, loyalty: 5)

        }


Ответы [ 2 ]

1 голос
/ 11 января 2020

Прежде всего вы должны изменить свой класс, потому что нет смысла принудительно разворачивать (!) Нормальные свойства, как вы, но вместо этого добавьте правильный метод init

class Crewman {
    var name: String
    var navSkill: Int      
    var combatSkill: Int
    var morale: Int     
    var loyalty: Int    

    init(name: String, navSkill: Int, combatSkill: Int, morale: Int, loyalty: Int) {
        self.name = name

        self.navSkill = navSkill
        self.combatSkill = combatSkill
        self.morale = morale
        self.loyalty = loyalty
    }
}

Я не понимаю, почему вы обе функции generateCrew и setUp выглядят одинаково, поэтому я просто сохраняю setUp.

В setUp Я сохранил большую часть кода и использую новый метод init, а затем Я добавляю каждый новый Crewman объект в конец покупки массива, используя append.

Чтобы получить случайные имена, я перетасовываю массив имен, который помещает их в случайный порядок, а затем я могу просто выбрать их из этот массив, используя индекс i. Также помните, что индекс массива начинается с 0, а не с 1, поэтому я изменил for l oop немного

var crewmenAll = [Crewman]()
var crewmen = [String: Crewman]()

func setUp() {
    let randomOrder = crewNames.shuffled()

    for i in 0..<25 {
        let name = randomOrder[i]

        let navInt = Int.random(in: 3...7)
        let combatInt = Int.random(in: 3...7)
        let moraleInt = Int.random(in: 3...7)

        crewmenAll.append(Crewman(name: name, navSkill: navInt, combatSkill: combatInt, morale: moraleInt, loyalty: 5))
    }
    crewmen = crewmenAll.reduce(into: [:]) {$0[$1.name] = $1 }
}
0 голосов
/ 11 января 2020

Вам нужно

// use struct , remove ! and have a free init
struct Crewman {
    var name: String
    var navSkill,combatSkill,morale,loyalty: Int   
}

letcrewNames = ["Chance", "Bruno", "Toby", "Damien", "Rafael", "Domenic", "Weston", "Edison", "Chris", "Grant", "Cortez", "Darren", "Nicolas", "Everette", "Jason", "Vicente", "Noe", "Ricky", "Ivory", "Thomas", "Guillermo", "Isreal", "Ben", "Winfred", "Lincoln", "Kareem", "Antwan", "Greg", "Lawrence", "Corey", "Todd", "Jeffery", "Rayford", "Julio", "Manual", "Chi", "Bradford", "Devon", "Bryan", "Andreas", "Don", "Erik", "Bobbie", "Tyree", "Felipe", "Clifton", "Carrol", "Kasey", "Cliff", "Jack"] 
var crewmenAll = [Crewman]()  

func generateCrew() {  
    var currentNames = [String]()  // hold temporary names 
    for i in 1...25 { 
        // generate unique random name 
        var name = crewNames[ Int.random(in: 0..<50)] 
        while currentNames.contains(name) { 
           name = crewNames[Int.random(in: 0..<50)]
        }
        currntNames.append(name)
        let navInt = Int.random(in: 3...7)
        let combatInt = Int.random(in: 3...7)
        let moraleInt = Int.random(in: 3...7)  
        crewmenAll.append(Crewman(name: name, navSkill: navInt, combatSkill: combatInt, morale: moraleInt, loyalty: 5))

    }
}
override func viewDidLoad() {   
   super.viewDidLoad()
   generateCrew() 
}

вам не нужно сначала создавать объекты nil внутри массива, а затем обращаться к ним с помощью [i], используя append напрямую

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