【发布时间】:2016-06-02 21:33:10
【问题描述】:
我是一个快速的新手,我在兜圈子试图让可选选项起作用。我已经做了很多谷歌搜索,阅读了 Apple Docs 等,但我在 ViewController 中遇到了这个(简化的)sn-p:
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。 -
用
var destUrl:String?替换var destUrl:String并尝试 -
谢谢大家 - 我现在在火车上,所以会尽快查看您的建议并回复。
-
@NikolaiRuhe:它编译是因为你可以向
AnyObject发送任意(已知)消息,它的行为类似于Objective-C 中的id。 -
@MartinR 我刚刚阅读了您的(链接的)帖子——我不知道这一点。感谢您提供翔实的描述!