Swift (Playground): использование неразрешенного идентификатора addAnimaltoZoo - PullRequest
0 голосов
/ 06 января 2019

Hi StackOverflow People,

Я недавно начал изучать iOS-разработку. У меня уже есть небольшой опыт работы с Java и Python, но Swift является для меня совершенно новым языком.

Я пытался применить классический пример класса животных для понимания игровой среды, синтаксиса и [логики?].

2 основных вопроса:

  1. Что касается ошибки (последняя строка в Animal Init), я думаю, я понимаю, почему я получил ошибку здесь, но я очень смущен тем, как ее исправить? Должен ли я сделать что-то необязательное? или я совершенно не понимаю формат MVC? Я пытался переместить метод внутри init, но у меня возникла проблема со ссылкой на переменную Zoo ... если я перемещу переменную zoo до определения класса, то получаю ошибки с Animal.

  2. Нужно ли создавать метод типа toString для классов для печати что-то нормальное в Swift? Я пытался делать поиски, но постоянно нашел ресурсы для структур, а не для классов ... так что я немного здесь тоже запутался.

Заранее спасибо <3 </p>

Код выглядит следующим образом:

import UIKit

print("Welcome to the Animal Playground.")

//Simple Animal Class
class Animal {
    var name : String
    var species : String
    var age : Int

    init(name:String, species:String, age:Int) {
        self.name = name
        self.species = species
        self.age = age
        addAnimaltoZoo(animal: self) **//Use of unresolved identifier 'addAnimaltoZoo'**
    }
}

//Everything afterward would be part of the AppController
var zoo = [Int: Animal]()
var animalCounter = 0;

func addAnimaltoZoo(animal: Animal) {
    zoo[animalCounter] = animal
    animalCounter += 1
}

var Tom = Animal(name: "Tom", species: "Cat", age: 105)
var Jerry = Animal(name: "Jerry", species: "Mouse", age: 108)

for (animalID, animalDetails) in zoo {
    print("\(animalID): \(animalDetails)")
}

Печать:

Welcome to the Animal Playground.
0: __lldb_expr_4.Animal
1: __lldb_expr_4.Animal

1 Ответ

0 голосов
/ 06 января 2019

У вас есть класс class Animal, и вы звоните addAnimalToZoo(animal:Animal), однако это НЕ ВИДЕТСЯ в Animal. Обратите внимание, что скобки { } для class Animal ЗАКРЫТЫ перед тем, как инициализировать addAnimalToZoo(animal:Animal). Следовательно, class Animal не может видеть эту ссылку. Вы можете, однако, сделать это

//Everything afterward would be part of the AppController
var zoo = [Int: Animal]()
var animalCounter = 0;

func addAnimaltoZoo(animal: Animal) {
    zoo[animalCounter] = animal
    animalCounter += 1
}

var Tom = Animal(name: "Tom", species: "Cat", age: 105)
var Jerry = Animal(name: "Jerry", species: "Mouse", age: 108)
addAnimalToZoo(animal: Tom)
addAnimalToZoo(animal:Jerry

for (animalID, animalDetails) in zoo {
    print("\(animalID): \(animalDetails)")
}

Примечание: я хотел бы сохранить это так, поскольку Animal и Zoo НЕ одинаковы, поэтому addAnimalToZoo(animal:Animal) НЕ должно быть в class Animal.

Что касается animalDetails, я не совсем уверен, что там происходит и что это печатает. Похоже, что он печатает zoo.enumerated(), который вы можете видеть из перечисленных () для массива .

Что вам следует делать, если вы хотите напечатать переменные животных или то, что я делаю, может быть, есть лучший способ, это создать метод и вызвать его.

class Animal {
    var name : String
    var species : String
    var age : Int

    init(name:String, species:String, age:Int) {
        self.name = name
        self.species = species
        self.age = age
    }

    func printAnimalDetails() {
        print("Age: \(self.age) -- Species: \(self.species) -- Name: \(self.name)")
    }
}

Тогда назовите это

for (index, animal) in zoo.enumerated() {
    print("\(index)", terminator: "") //The terminator allows it to NOT create a new line on the next print statement.
    animal.printAnimalDetails()
}
...