实例成员不能用于类型 - 错误
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.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' 不能用于类型 '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 playerChoice
是Sign
的实例。
刚刚实现了您的解决方案,并且在checkInputs
中的所有if
语句中,出现以下错误:Instance member 'emoji' cannot be used on type 'Sign'
有什么建议吗?
@JBDouble05 您能否将您的代码更新为您的问题当前问题下方中的编辑并指出它显示错误的位置?
现在完成,抱歉回复晚了 - 我在 AEST以上是关于实例成员不能用于类型 - 错误的主要内容,如果未能解决你的问题,请参考以下文章
错误:静态成员 copyWithZone 不能用于 UIImageView 类型的实例