处理 Swift 中的 nil 值

Handle nil value in Swift

NSString(data: data, encoding: NSUTF8StringEncoding) returns 无。 (正确)如果值为 nil,我需要将变量 stringResponse 设置为 "",否则设置为 NSString(data: data, encoding: NSUTF8StringEncoding) returns。我是这样做的:

override func start() {
    if self.cancelled {
        return
    }

    var stringResponse: String?
    var urlString: String!
    if self.arduinoConnection.arduinoHTTPPort == 80 {
        urlString = String(format: "http://%@/arduino/%@/%i/", arguments: [self.arduinoConnection.arduinoAddress, self.arduinoConnection.pinType.lowercaseString, self.arduinoConnection.arduinoPin])
    } else {
        urlString = String(format: "http://%@:%i/arduino/%@/%i/", arguments: [self.arduinoConnection.arduinoAddress, self.arduinoConnection.arduinoHTTPPort, self.arduinoConnection.pinType.lowercaseString, self.arduinoConnection.arduinoPin])
    }
    //let url = NSURL(string: urlString)
    let url = NSURL(string: "http://10.0.3.9:8888/index.html")
    let request = NSURLRequest(URL: url!)

    if self.cancelled {
        return
    }


    NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) {(response, data, error) in

        stringResponse = NSString(data: data, encoding: NSUTF8StringEncoding) as? String ?? ""

        if (stringResponse == "") {
            self.arduinoConnection.state = .Failed
            self.arduinoConnection.switchState = false
            self.arduinoConnection.statusText = "Failed To Connect"

            self.delegate?.didFinishDownloading(GettingState.Failed, statusText: "Failed To Connect", switchState: false)
        } else {
            self.arduinoConnection.state = .Downloaded
            if (stringResponse == "0") {
                self.arduinoConnection.state = .Downloaded
                self.arduinoConnection.switchState = false
                self.ardCTS.state = .Downloaded
                self.ardCTS.switchState = false
                self.arduinoConnection.statusText = "Connected"

                self.delegate?.didFinishDownloading(GettingState.Downloaded, statusText: "Connected", switchState: false)
            } else if (stringResponse == "1") {
                self.arduinoConnection.state = .Downloaded
                self.arduinoConnection.switchState = true
                self.arduinoConnection.statusText = "Connected"
                self.ardCTS.state = .Downloaded
                self.ardCTS.switchState = true

                self.delegate?.didFinishDownloading(GettingState.Downloaded, statusText: "Connected", switchState: true)
            }
        }
        self.executing = false
        self.finished = true
    }
    executing = true
    self.finished = false
}

当应用程序运行这段代码时,我有:

fatal error: unexpectedly found nil while unwrapping an Optional value

请帮帮我!

var stringResponse: String?

NSURLConnection.sendAsynchronousRequest(request,
                         queue: NSOperationQueue.mainQueue()) {(response, data, error) in

    stringResponse = NSString(data: data, encoding: NSUTF8StringEncoding) as? String ?? ""

您没有在测试错误。你可能会被传递一个 nil NSData,因为这个接口还没有被 Apple 完全审计,并且仍然传递隐式解包的可选值。你必须处理这些。

if let error = error {
    // We got an error; do something about it
    return
}

// OK, now we know that the data is good
stringResponse = NSString(data: data, encoding: NSUTF8StringEncoding)

您不应该将其转换为任何内容。这个函数returns一个String?,就是stringResponse