Элемент экземпляра нельзя использовать для типа - ошибка - PullRequest
0 голосов
/ 11 сентября 2018

У меня странная ошибка, и мне не повезло в попытке ее исправить. У меня есть несколько связанных файлов, и я вызываю функцию в одном файле (ViewController), который определен в другом файле (Sign.swift). Функция в Sign.swift создает вывод, определенный в другом файле (GameState.swift). Я не уверен, что с этим не так, я провел много исследований, и даже этот ответ не помог. (ошибки по коду).

ViewController.swift:

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBOutlet weak var computerLabel: UILabel!
    @IBOutlet weak var output: UILabel!
    @IBOutlet weak var rockButton: UIButton!
    @IBOutlet weak var paperButton: UIButton!
    @IBOutlet weak var scissorsButton: UIButton!
    @IBOutlet weak var playAgain: UIButton!

    @IBAction func rockButtonPressed(_ sender: UIButton) {
        computerLabel.text = randomSign()
        var playerChoice = Sign.rock
        var output = Sign.checkInputs(playerChoice, computerLabel.text) //Error 1 is here
    }

    @IBAction func paperButtonPressed(_ sender: UIButton) {

    }

    @IBAction func scissorsButtonPressed(_ sender: UIButton) {

    }

    @IBAction func playAgainPressed(_ sender: UIButton) {

    }


}

Sign.swift:

import Foundation
import GameplayKit

let randomChoice = GKRandomDistribution(lowestValue: 0, highestValue: 2)

func randomSign() -> String {
    let sign = randomChoice.nextInt()
    if sign == 0 {
        return "?"
    }
    else if sign == 1 {
        return "?"
    }
    else {
        return "✌️"
    }
}

enum Sign {
    case rock, paper, scissors

    var emoji: String {

        switch self {

        case .rock:
            return "?"
        case.paper:
            return "?"
        case.scissors:
            return "✌️"
        }
    }

    func checkInputs(_ user: Sign, opponent: Sign) -> String {
        var outcome = GameState.draw
        if (opponent == .rock) {
            if (emoji == "?") {
                outcome = .draw
            }
            else if (emoji == "?") {
                outcome = .win
            }
            else {
                outcome = .lose
            }
        }
        else if (opponent == .paper) {
            if (emoji == "?") {
                outcome = .lose
            }
            else if (emoji == "?") {
                outcome = .draw
            }
            else {
                outcome = .win
            }
        }
        else if (opponent == .scissors) {
            if (emoji == "?") {
                outcome = .win
            }
            else if (emoji == "?") {
                outcome = .lose
            }
            else {
                outcome = .draw
            }
        }

        return outcome //Error 2 is here
    }

}

GameState.swift

import Foundation

enum GameState {
    case start, win, lose, draw

    var text: String {

        switch self {
        case.start:
            return "Game started!"

        case.win:
            return "You win!"

        case.lose:
            return "You lose!"

        case.draw:
            return"It's a draw!"
        }

    }

}

Я получаю ошибки в обоих файлах: Ошибка 1 (закомментированная строка в ViewController.swift) содержит следующее сообщение об ошибке:

Элемент экземпляра 'checkInputs' нельзя использовать для типа 'Sign'; ты сделал значит использовать вместо этого значение этого типа?

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

Ошибка 2 (закомментированная строка в Sign.swift) содержит следующее сообщение:

Невозможно преобразовать возвращаемое выражение типа GameState в возвращаемый тип. 'Строка'

Опять же, я не понимаю, что здесь происходит. В моем файле GameState.swift нет ошибок, поэтому все ошибки должны быть в ViewController.swift и Sign.swift. Как мне исправить эти ошибки?

РЕДАКТИРОВАТЬ: Я обновил свой код, теперь он выглядит так:

ViewController.swift

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func computerChoose() {

    }

    @IBOutlet weak var computerLabel: UILabel!
    @IBOutlet weak var output: UILabel!
    @IBOutlet weak var rockButton: UIButton!
    @IBOutlet weak var paperButton: UIButton!
    @IBOutlet weak var scissorsButton: UIButton!
    @IBOutlet weak var playAgain: UIButton!

    @IBAction func rockButtonPressed(_ sender: UIButton) {
        var random = randomSign()
        var stringRandom = ""
        switch random {
        case .rock :
            stringRandom = "?"
        case .paper:
            stringRandom = "?"
        case .scissors:
            stringRandom = "✌️"
        }
        var playerChoice = Sign.rock
        var output = Sign.checkInputs(random)
        computerLabel.text = stringRandom
    }

    @IBAction func paperButtonPressed(_ sender: UIButton) {

    }

    @IBAction func scissorsButtonPressed(_ sender: UIButton) {

    }

    @IBAction func playAgainPressed(_ sender: UIButton) {

    }


}

Sign.swift

import Foundation
import GameplayKit

let randomChoice = GKRandomDistribution(lowestValue: 0, highestValue: 2)

func randomSign() -> Sign {
    let sign = randomChoice.nextInt()
    if sign == 0 {
        return .rock
    }
    else if sign == 1 {
        return .paper
    }
    else {
        return .scissors
    }
}

enum Sign {
    case rock, paper, scissors

    var emoji: String {

        switch self {

        case .rock:
            return "?"
        case.paper:
            return "?"
        case.scissors:
            return "✌️"
        }
    }

    static func checkInputs(_ opponent: Sign) -> GameState {
        var outcome = GameState.draw
        if (opponent == .rock) {
            if (emoji == "?") { //Error Emoji
                outcome = .draw
            }
            else if (emoji == "?") { //Error Emoji
                outcome = .win
            }
            else {
                outcome = .lose
            }
        }
        else if (opponent == .paper) { //Error Emoji
            if (emoji == "?") {
                outcome = .lose
            }
            else if (emoji == "?") { //Error Emoji
                outcome = .draw
            }
            else {
                outcome = .win
            }
        }
        else if (opponent == .scissors) {
            if (emoji == "?") { //Error Emoji
                outcome = .win
            }
            else if (emoji == "?") { //Error Emoji
                outcome = .lose
            }
            else {
                outcome = .draw
            }
        }

        return outcome
    }

}

Примечание: Новые ошибки появляются в каждой строке с комментарием Error Emoji, с этим сообщением об ошибке:

Элемент экземпляра 'emoji' нельзя использовать для типа 'Знак'

GameState.swift: Без изменений .

Буду признателен за помощь.

1 Ответ

0 голосов
/ 11 сентября 2018

Если вам нужно использовать метод без экземпляра , вам нужно объявить метод как static.

static func checkInputs(_ user: Sign, opponent: Sign) -> String

Примечание. Похоже, вы не используете user, который вы передаете. IMO, вы можете пропустить запрос этого параметра и использовать его как метод экземпляра с playerChoice.

func checkInputs(opponent: Sign) -> String {
    // Your logic
}

А потом используйте это так

playerChoice.checkInputs(opponent: randomSign())

Вторая ошибка связана с тем, что вы пытаетесь вернуть экземпляр Sign вместо String. Вам нужно либо изменить тип возвращаемого значения на Sign, либо преобразовать Sign в outcome в String - outcome.text, как указано @Larme?

...