我是一个 Swift 新手,一直在尝试让可选值起作用,但却总是进入死循环。我进行了大量的谷歌搜索,阅读了苹果文档等等,但仍然无法解决以下 ViewController 中的这个(简化的)代码段:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if (segue.identifier == "segueToWebView") {
// check what we're passing around
print(sender!.urlString) // Optional("http://www.bbc.co.uk")
// do some url validation etc
var destUrl:String
if sender!.urlString == nil{
destUrl = "http://www.google.com"
} else {
destUrl = sender!.urlString // *** Error here ***
}
let targetWebViewController:GDWebViewController = segue.destinationViewController as! GDWebViewController
targetWebViewController.loadURLWithString(destUrl)
targetWebViewController.showsToolbar = true
targetWebViewController.title = sender!.busName // this works correctly too (so isn't that a String?)
}
}
错误信息是
Cannot assign value of type 'String?!' to type 'String'
,标记的那行代码出了问题。我已经尝试过不同的解包方法,但还是无法解决问题。更多代码
发送者是一个自定义的UIButton子类,具有以下结构:
import UIKit
class TestButton: UIButton {
var urlString: String?
var busName: String?
}
我将变量设置为可选的,因为我不知道按钮是否具有这些属性。
当按钮被点击时调用的方法是:
func tapTap(sender: TestButton) {
print(sender.busName, sender.urlString) // Optional("My Button") Optional("http://www.bbc.co.uk")
self.performSegueWithIdentifier("segueToWebView", sender: sender)
}
我知道Swift中的可选项对于像我这样的新手来说是一个常见的绊脚石,虽然有很多文档可以参考,但我仍无法理解,所以如果能提供任何帮助将不胜感激。
print(sender!.urlString)
不应该编译通过,因为AnyObject
没有成员urlString
。 - Nikolai Ruhevar destUrl:String
替换为var destUrl:String?
,然后尝试。 - Mohammad Sadiq ShaikhAnyObject
发送任意(已知)消息,类似于Objective-C中的id
。 - Martin R