Swift中奇怪的可选错误

时间:2016-07-15 15:49:55

标签: swift string firebase optional

好的,基本上我正在关注如何使用Backendless和Firebase创建聊天的udemy教程。但是,我不想使用Backendless,因为我不想依赖2个提供商 - 所以我只想坚持使用Firebase。因此,我目前正在将代码转换为Firebase。

我有一个视图控制器,它为每个UID显示一个唯一的页面 - 来自我拥有的数据库。 UID存储为String,并在另一个表视图控制器的segue上分配(这很好)。之后,我使用UID从用户那里获取我想要的数据。我有一个"开始聊天"应该创建新聊天的按钮。

在本教程中,教师设置了一个协议(委托),它从另一个视图控制器触发另一个函数。这就是它的样子:

protocol ChooseUserDelegate {
    func createChatroom(withUser: String)
}

var delegate: ChooseUserDelegate!

在聊天@IBAction中,我有以下代码:

@IBAction func StartChat(sender: AnyObject) {

    let userID = uid
    if let theId = userID as? String {
        delegate.createChat(String(theId))
    }

}

(上面的代码都在同一个VC中。)。

在另一个视图控制器中,存储createChat()函数的是以下代码:

class AnotherVC UIViewController, UITableViewDelegate, UITableViewDataSource, ChooseUserDelegate{

    func createChat(withUser: String) {

        print(withUser)

    }

}

由于createChat()上的可选错误(展开),问题是我无法拨打delegate.createChat(String(theId))

编辑:即使使用""输入,我收到一个错误。我现在真的很困惑。我的代表有问题吗?

2 个答案:

答案 0 :(得分:2)

代码中唯一可选的部分是delegate(因为您正确解开了userID)。因此,错误必须归因于delegatenil。确保在致电delegate之前设置StartChat()

var delegate: ChooseUserDelegate!行未初始化委托。当您编写ChooseUserDelegate!时,您只是定义delegate变量的类型。它会自动设置为nil。要初始化ChooseUserDelegate的新实例,您需要编写如下内容:

var delegate: ChooseUserDelegate! = ChooseUserDelegate()

还有一些其他方法可以清理代码。方法名称应该是llamaCase,而不是CamelCase,因此您应该将StartChat()重命名为startChat()(确保在界面构建器中重新连接)。该方法的主体对同一个变量uid有三个不同的名称。看看它有多简单:

@IBAction func startChat(sender: AnyObject) {
    if let uid = uid as? String {
        delegate.createChat(uid)
    }
}

答案 1 :(得分:0)

if let theId = userID {
    delegate.createChat(String(theId))
}