Xcode Swift 2变量声明(实例成员不能在类型视图控制器上使用)

时间:2015-11-13 21:05:30

标签: ios xcode swift swift2 xcode7

我正在开发一个项目,该项目发送一些带有用户在文本字段中定义的IP地址的HTTP命令。 IP地址基本上用于我的应用程序的许多不同功能。正如我所做的那样,我一直在进入"实例成员不能用于类型"错误。在变量声明的基础上,执行以下操作的正确方法是什么?我将有大约40-50个不同的请求。

@IBOutlet weak var myIPaddress: UITextField!
var baserequest = "http://\(myIPaddress):8088/api/?function="
var requestA = "\(baserequest)myFunctionA&value=abc"
var requestB = "\(baserequest)myFunctionB&value=xyz"
var requestC = "\(baserequest)myFunctionC&value=123"
...
...

我不确定这是否重要但是因为我们正在使用HTTP命令,其中一个声明看起来像这样

var program1 = NSMutableURLRequest(URL: NSURL(string: "\(baseRequest)activeinput&input=1" )!)

*更新*

我不确定我的问题是什么。这是我的代码,它仍然抛出了这个错误。上

var request1 = NSMutableURLRequest(URL: NSURL(string: "\(baserequest)activeinput&input=1" )!)

所以这是我的整个代码

import UIKit
import Foundation


func httpGet(request: NSURLRequest!, callback: (String?, NSError?) -> Void) {
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in
    guard error == nil && data != nil else {
        callback("", error)
        return
    }

    callback(String(data: data!, encoding: NSUTF8StringEncoding), nil)
}
task.resume()
}

class FirstViewController: UIViewController, UITextFieldDelegate {

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 vmixip: UITextField!
var baserequest: String = ""

func textFieldDidEndEditing(textField: UITextField) {
    updateBaseRequest(textField.text!)
}

func updateBaseRequest(vmixip: String) {
    baserequest = "http://\(vmixip):8088/api/?function="
}

var request1 = NSMutableURLRequest(URL: NSURL(string: "\(baserequest)activeinput&input=1" )!)
@IBAction func Program1(sender: UIButton) {
    if let image = UIImage(named:"g1") {
        sender.setImage(image, forState: .Normal)
    }
    httpGet(request1) { string, error in
        guard error == nil && string != nil else {
            print(error?.localizedDescription)
            return
        }

        print(string!) //
    }


}

}

2 个答案:

答案 0 :(得分:2)

在拥有用户的IP地址后,您应该在函数中初始化请求变量。错误是试图告诉您变量的默认值can't something that hasn't been initialized yetmyIPaddress)。

类似的东西:

@IBAction func addressEntered(sender: UIButton) {
    // NOTE: Use myIPaddress.text to get the text
    baserequest = "http://\(myIPaddress.text):8088/api/?function="
    requestA = "\(baserequest)myFunctionA&value=abc"
    requestB = "\(baserequest)myFunctionB&value=xyz"
    requestC = "\(baserequest)myFunctionC&value=123"
}

此外,如果您需要在整个班级中使用这些变量,则需要将这些变量声明为选项:

class MyClass {
    var requestA: String?
    ...
}

或者,您可以将请求变量转换为computed properties

class MyClass {
    var baseRequest: String?
    var requestA: String {
        // Beware, this would crash if used before baseRequest was initialized
        return "\(baseRequest!)myFunctionA&value=abc"
    }
}

答案 1 :(得分:1)

"实例成员不能用于类型"错误是由引用尚未提供的值引起的。

例如,您无法

var myValue = "something"

然后再次在

中引用该值
var myValueAgain = self.myValue

属性的初始化不像函数中的代码那样工作。这是因为" self"在创建对象之前不可用。您正试图访问" self"在它可用之前。

另一个问题是你指的是

中的UITextField
var baserequest = "http://\(myIPaddress):8088/api/?function="

而您可以使用的String类型的值在

myIPaddress.text

在初始化时分配值也不会在UI中更改时自动更新值。

处理文本字段的更改需要实现UITextFieldDelegate的方法,例如

  • textFieldDidBeginEditing:
  • textFieldDidEndEditing:

当用户更新文本字段中的文本时,您可以使用这些方法更新baserequest。

因此,你的班级会有类似的东西

class MyViewController: UIViewController, UITextFieldDelegate {

    var baserequest: String

    func textFieldDidEndEditing(textField: UITextField) {
        updateBaseRequest(textField.text)
    }

    func updateBaseRequest(ipAddress: String) {
        baserequest = "\(ipAddress)..."
    }
}