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

Posted

技术标签:

【中文标题】实例成员不能用于类型 - 错误【英文标题】:Instance member cannot be used on type - error 【发布时间】:2019-02-15 18:36:15 【问题描述】:

我遇到了一个奇怪的错误,并且尝试修复它没有运气。我有一些链接文件,我正在一个文件 (ViewController) 中调用另一个文件 (Sign.swift) 中定义的函数。 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) 

    



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.swiftSign.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' 不能用于类型 'Sign'

GameState.swift不变

我将不胜感激。

【问题讨论】:

checkInputs 是实例函数,而不是static 函数。您需要使用Sign 类型的值调用它或将其设为static。后者看起来像。 你需要知道,在OOP中,有Instance/Object方法和Class方法。如何定义它们取决于语言(在 Swift 中是静态的还是非静态的),但与在 Swift 中一样,您正在调用 checkInputs() 方法,因为它是一个类而不是一个实例,但它被定义为一个实例方法。对于另一个问题,您的意思是 return outcome.text 吗? 【参考方案1】:

如果需要使用没有实例的方法,则需要将方法声明为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 或将outcome 中的Sign 转换为String - outcome.text 就像@Larme 指出的那样?

【讨论】:

如果这听起来很简单,我深表歉意,但是 instance 到底是什么? 在调用checkInputs 之前创建的@JBDouble05 playerChoiceSign实例 刚刚实现了您的解决方案,并且在checkInputs 中的所有if 语句中,出现以下错误:Instance member 'emoji' cannot be used on type 'Sign' 有什么建议吗? @JBDouble05 您能否将您的代码更新为您的问题当前问题下方中的编辑并指出它显示错误的位置? 现在完成,抱歉回复晚了 - 我在 AEST

以上是关于实例成员不能用于类型 - 错误的主要内容,如果未能解决你的问题,请参考以下文章

惰性 var 给出“实例成员不能用于类型”错误

错误:静态成员 copyWithZone 不能用于 UIImageView 类型的实例

静态类函数:实例成员不能用于类型

这里出了啥问题:实例成员不能用于类型 [重复]

静态成员“负载”不能用于“AppDelegate”类型的实例

实例成员不能用于 struct swift 之间的嵌套类型的实例