我遇到了将值传递给swift中的类的问题。我有ViewControler.swift创建对象和其他UI类型的东西。这是代码:
class ViewController: UIViewController {
//creates the Intractive button objects
@IBOutlet var Bag1: UIButton!
@IBOutlet var Bag2: UIButton!
@IBOutlet var Bag3: UIButton!
@IBOutlet var lblTokenSlider: UILabel!
@IBOutlet var slider: UIStepper!
@IBOutlet var Go: UIButton!
@IBOutlet var counter: UILabel!
var count = 10
var noOfBags = 3
//gives acces to game AP!
var gameAPI = GameAPI(noOfBags: count, noOfTokens: noOfBags )
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
lblTokenSlider.hidden = true
slider.hidden = true
Go.hidden = true
counter.hidden = true
Bag3.hidden = false
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// Event Drivers
@IBAction func btnBag1(sender: AnyObject) {
Bag1.userInteractionEnabled = false
Bag2.userInteractionEnabled = false
Bag3.userInteractionEnabled = false
}
@IBAction func btnBag2(sender: AnyObject) {
}
@IBAction func btnBag3(sender: AnyObject) {
}
@IBAction func SliderAction(sender: AnyObject) {
}
@IBAction func RemoveTokens(sender: AnyObject) {
}
}
}
这是我的gameAPI:
import Foundation
private enum MoveError: ErrorType {
case Empty
}
class GameAPI {
var noOfBags: Int
var bagArray:[Bag] = []
init(noOfBags: Int, noOfTokens : Int){
self.noOfBags = noOfBags
for _ in 0..<noOfBags {
bagArray.append(Bag(counter: noOfTokens))
}
}
/* Returns the amount of counters are in a bag */
func getCounts(i :Int ) -> Int {
return bagArray[i].getCount()
}
func isBagEmpty(i: Int) -> Bool {
if (bagArray[i].getCount() <= 0){
return true
}
else {
return false
}
}
func removeCounter(bagToRemove: Int, counters: Int ) throws{
do {
try self.bagArray[bagToRemove].removeCount(counters)
}
catch{
throw MoveError.Empty
}
}
}
问题是我在ViewController中声明GameAPI然后得到的
&#39;实例成员&#39;计数&#39;不能用于类型&#39; ViewController&#39;&#39;
在线
var gameAPI = GameAPI(noOfBags: count, noOfTokens: noOfBags )
但是,如果我要切换变量并使用固定值,如:
var gameAPI = GameAPI(noOfBags: 10, noOfTokens: 3 )
工作正常。我真的不明白为什么这不起作用。
谢谢
答案 0 :(得分:1)
问题是您使用另一个实例变量来获取实例变量的初始值。通常,在初始化所有实例变量之前,不能使用实例变量。因此,您必须打破实例变量之间的依赖关系。
您有几种选择:
将初始化移至ininitalizer。但count
有点困难,因为你需要至少两个初始化器,导致代码重复:
noOfBags
将static let count = 10
static let noOfBags = 3
和GameAPI
声明为全局常量:
self
因此,count
初始值设定项不会使用noOfBags
。
如果您需要initialCount
和initialNoOfBags
作为变量,则可以创建全局常量var count = initialCount
var noOfBags = initialNoOfBags
var gameAPI = GameAPI(noOfBags: initialCount, noOfTokens: initialNoOfBags)
和gameAPI
,然后
lazy var gameAPI: GameAPI = GameAPI(noOfBags: self.count, noOfTokens: self.noOfBags)
您可以懒惰地初始化[_tableView beginUpdates];
[_tableView endUpdates];
:
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
答案 1 :(得分:0)
这是因为你只能在ViewController
类的任何方法之外声明变量。但你不能在任何方法之外分配任何变量。
假设您要声明一个变量,如:
let tempVar = 0
这不在方法之内,而是在视图控制器类中,如:
import UIKit
class ViewController: UIViewController {
let tempVar = 0
}
现在,如果您在类中创建另一个变量,如:
import UIKit
class ViewController: UIViewController {
let tempVar = 0
let tempVar2 = tempVar
}
并且您为该变量tempVar2
提供的值为tempVar
。这会给你一个错误:
Instance member 'tempVar' cannot be used on type 'ViewController'
您收到此信息是因为您要在错误的地方为tempVar2
实例分配值。您可以通过以下方式将值分配到viewDidLoad
方法或任何其他方法来解决此错误:
import UIKit
class ViewController: UIViewController {
let tempVar = 0
var tempVar2 = 1
override func viewDidLoad() {
tempVar2 = tempVar
}
}
答案 2 :(得分:-1)
在Swift中,您无法在属性初始值设定项中使用实例属性,因为属性初始值设定项在“self”可用之前运行。
您可以通过将gameAPI
变量改为计算属性来解决此问题。
所以而不是:
var count = 10
var noOfBags = 3
var gameAPI = GameAPI(noOfBags: count, noOfTokens: noOfBags)
试试这个:
var count = 10
var noOfBags = 3
var gameAPI: GameAPI {
return GameAPI(noOfBags: count, noOfTokens: noOfBags)
}