Не удается преобразовать значение типа 'String' в ожидаемый тип аргумента 'Player?' - PullRequest
0 голосов
/ 28 января 2020

У меня небольшая проблема с моим кодом. Когда я вызываю класс Player для моего массива в моем "TeamNamesViewController", я получаю сообщение об ошибке

"Невозможно преобразовать значение типа 'String' в ожидаемый тип аргумента 'Player?'"

Ошибка появляется в этой строке

NewPLayer.append(InputNameTextField.text!)

Под моим удовольствием c InsertNewName()

Но если я только создаю массив String, такой как var NewPLayer: [String?] = [] в моем TeamNamesViewController работает отлично!

Что мне делать?

___

    import Foundation

    class Player {
        var name : String?
         var score : Int

        init(name: String?, score: Int) {
            self.name=name
            self.score=score
        }
    }

    import UIKit

    class TeamNamesViewController: UIViewController,UITableViewDelegate,UITableViewDataSource,UITextFieldDelegate {
        var NumberOfTeams = 0
        let NewTeamCell =  "NewTeamCell"

        @IBOutlet weak var InputNameTextField: UITextField!
        @IBOutlet weak var TableViewTeams: UITableView!
        var person = Player(name: nil, score: 0)
        var NewPLayer: [Player?] = []

        override func viewDidLoad() {
            super.viewDidLoad()
            InputNameTextField.becomeFirstResponder()
            // Do any additional setup after loading the view.
        }

        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return NewPLayer.count
        }
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

            let cell = tableView.dequeueReusableCell(withIdentifier: NewTeamCell, for: indexPath)
            cell.textLabel?.text = NewPLayer[indexPath.row]?.name
            return cell
        }

        @IBAction func AddTeamButton(_ sender: UIButton) {

            InsertNewName()
            if NumberOfTeams + 1 < NewPLayer.count {
                NumberOfTeams += 1
                InputNameTextField?.text = NewPLayer[NumberOfTeams]?.name
            } else {
                NumberOfTeams = 0
            }
        }

        func InsertNewName(){
            NewPLayer.append(InputNameTextField.text!) //The error appears here


            let indexPath = IndexPath(row: NewPLayer.count - 1, section: 0)

            TableViewTeams.beginUpdates()
            TableViewTeams.insertRows(at: [indexPath], with: .automatic)
            TableViewTeams.endUpdates()

            InputNameTextField.text = ""
            view.endEditing(true)

            print(NewPLayer)
        }

        func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
            return true
        }
        func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
            if editingStyle == .delete {
                NewPLayer.remove(at: indexPath.row)
                TableViewTeams.beginUpdates()
                TableViewTeams.deleteRows(at: [indexPath], with: .automatic)
                TableViewTeams.endUpdates()
            }
        }
    }

Ответы [ 2 ]

3 голосов
/ 28 января 2020

Ваш NewPlayer имеет тип [Player], что означает, что он будет принимать объект типа Player.

NewPLayer.append(Player(name:InputNameTextField.text! , score : 0 ) )

Кроме того, не объявляйте переменные в верхнем регистре. Следуйте этому руководству RayWendelich , чтобы лучше понять.

2 голосов
/ 28 января 2020

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

var newPLayer : [Player] = []

Ошибка довольно очевидна. Вы собираетесь добавить String к массиву Player, что невозможно.

Вам необходимо создать экземпляр Player из строки

newPLayer.append( Player(name: InputNameTextField.text, score: 0))

Примечание:

Удалить строки begin-/endUpdates(). Они не имеют никакого эффекта.

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