首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选拔赛的快速麻烦

选拔赛的快速麻烦
EN

Stack Overflow用户
提问于 2016-06-02 13:15:18
回答 3查看 123关注 0票数 4

我是一个快速的新手,四处转转,试图让选秀者去工作。我已经做了很多谷歌搜索,读过Apple等等,但是我正在挣扎于我的ViewController中的这个(简化的)片段:

代码语言:javascript
复制
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子类:

代码语言:javascript
复制
import UIKit

class TestButton: UIButton {
    var urlString: String?
    var busName: String?
}

我已经将变量设置为可选的,因为我不知道按钮是否会/不会有这些属性。

点击按钮时调用的方法如下:

代码语言:javascript
复制
func tapTap(sender: TestButton) {
    print(sender.busName, sender.urlString) // Optional("My Button") Optional("http://www.bbc.co.uk")
    self.performSegueWithIdentifier("segueToWebView", sender: sender)
}

我知道对于像我这样的新手来说,斯威夫特选拔赛是一个常见的绊脚石,而且有很多关于他们的文档,但我无法理解,所以任何帮助都是很好的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-06-02 13:32:08

有三个级别的选拔赛:

  • sender: AnyObject?参数是可选的。
  • AnyObject发送任意消息的行为类似于可选链接,并返回隐式未包装可选(比较The strange behaviour of Swift's AnyObject)。
  • var urlString: String?属性是可选的。

要解决前两个选项,请使用对具体按钮类的可选绑定/转换:

代码语言:javascript
复制
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if (segue.identifier == "segueToWebView") {
        if let button = sender as? TestButton {
           // The type of `button`  is `TestButton`
           // ...
        }
    }
}

现在

代码语言:javascript
复制
var destUrl: String
if button.urlString == nil {
    destUrl = "http://www.google.com"
} else {
    destUrl = button.urlString!
}

会编译,但最好用零合并操作符来处理:

代码语言:javascript
复制
let destUrl = button.urlString ?? "http://www.google.com"

请注意,不再有强制展开!操作符了!

票数 10
EN

Stack Overflow用户

发布于 2016-06-02 13:29:13

你只要做这样的事:

代码语言:javascript
复制
var destUrl:String
if let durl = sender!.urlString {
   destUrl = durl
} else {
   destUrl = "http://www.google.com"
}

代码中的问题是,destUrl是字符串,但发送方!.urlString是可选的。所以你不能给另一个分配。在分配之前,您必须打开可选选项。要么强行拆开它(用!)如果让的话。我建议你同意,但这取决于你。

票数 3
EN

Stack Overflow用户

发布于 2016-06-02 13:30:21

您正在手动测试nil字符串,但随后忘记了打开它:

代码语言:javascript
复制
var destUrl:String
if sender!.urlString == nil{
    destUrl = "http://www.google.com"
} else {
    destUrl = sender!.urlString!
}

(请参见添加的感叹号。)

但是,像这样展开字符串实际上更容易:

代码语言:javascript
复制
let destUrl = sender!.urlString ?? "http://www.google.com"

??操作符测试的是0、展开或返回右侧,所有这些都在一行中。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37592976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档