代码之家  ›  专栏  ›  技术社区  ›  Jack Bashford

实例成员不能用于类型-错误

  •  0
  • Jack Bashford  · 技术社区  · 6 年前

    我犯了一个奇怪的错误,想改正它却没有运气。我有一些链接文件,我在一个文件中调用了一个函数( ViewController )在另一个文件中定义的( Sign.swift )功能在 斯威夫特 创建在另一个文件中定义的输出( GameState.swift )我不知道这是怎么回事,我做了很多研究,甚至 this answer 没有帮助。(代码下有错误)。

    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) {
    
        }
    
    
    }
    

    斯威夫特 :

    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
        }
    
    }
    

    斯威夫特 :

    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(注释行 视图控制器.swift )出现以下错误消息:

    实例成员“checkinputs”不能用于类型“sign”;是否 表示使用此类型的值?

    不幸的是,我不明白我要从上面的信息中修复什么,我对斯威夫特是个新手。

    错误2(注释行 斯威夫特 )有此消息:

    无法将“gamestate”类型的返回表达式转换为返回类型 “弦”

    再说一次,我不明白这里发生了什么。我没有任何错误 斯威夫特 但是,这意味着所有错误都应该在 视图控制器.swift 斯威夫特 . 我应该如何修复这些错误?

    编辑: 我已经更新了我的代码,现在看起来像这样:

    视图控制器.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) {
    
        }
    
    
    }
    

    斯威夫特 :

    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”不能用于类型“sign”

    斯威夫特 : 不变 .

    我将非常感谢你对我的帮助。

    1 回复  |  直到 6 年前
        1
  •  5
  •   Rakesha Shastri    6 年前

    如果需要使用不带 实例 ,您需要将方法声明为 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 . 您需要将返回类型更改为 符号 或隐藏 符号 在里面 outcome - outcome.text 就像@larme指出的那样?