我是一个快速的新手,四处转转,试图让选秀者去工作。我已经做了很多谷歌搜索,读过Apple等等,但是我正在挣扎于我的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)
}我知道对于像我这样的新手来说,斯威夫特选拔赛是一个常见的绊脚石,而且有很多关于他们的文档,但我无法理解,所以任何帮助都是很好的。
发布于 2016-06-02 13:32:08
有三个级别的选拔赛:
sender: AnyObject?参数是可选的。AnyObject发送任意消息的行为类似于可选链接,并返回隐式未包装可选(比较The strange behaviour of Swift's AnyObject)。var urlString: String?属性是可选的。要解决前两个选项,请使用对具体按钮类的可选绑定/转换:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if (segue.identifier == "segueToWebView") {
if let button = sender as? TestButton {
// The type of `button` is `TestButton`
// ...
}
}
}现在
var destUrl: String
if button.urlString == nil {
destUrl = "http://www.google.com"
} else {
destUrl = button.urlString!
}会编译,但最好用零合并操作符来处理:
let destUrl = button.urlString ?? "http://www.google.com"请注意,不再有强制展开!操作符了!
发布于 2016-06-02 13:29:13
你只要做这样的事:
var destUrl:String
if let durl = sender!.urlString {
destUrl = durl
} else {
destUrl = "http://www.google.com"
}代码中的问题是,destUrl是字符串,但发送方!.urlString是可选的。所以你不能给另一个分配。在分配之前,您必须打开可选选项。要么强行拆开它(用!)如果让的话。我建议你同意,但这取决于你。
发布于 2016-06-02 13:30:21
您正在手动测试nil字符串,但随后忘记了打开它:
var destUrl:String
if sender!.urlString == nil{
destUrl = "http://www.google.com"
} else {
destUrl = sender!.urlString!
}(请参见添加的感叹号。)
但是,像这样展开字符串实际上更容易:
let destUrl = sender!.urlString ?? "http://www.google.com"??操作符测试的是0、展开或返回右侧,所有这些都在一行中。
https://stackoverflow.com/questions/37592976
复制相似问题