Swift中用一行代码检查Optional是否为nil

3

如何在一行中检查Swift中的可选变量是否为nil并返回布尔值?

目前我尝试过以下方法:

class UserManager  {

    var signedInUser: User? = nil

    // some code

    func isSignedIn() -> Bool {
        return self.signedInUser?
    }
}

这会导致以下错误信息:

无法将表达式的类型'$T3??'转换为类型'Bool'

此外,我尝试了以下方法:
func isSignedIn() -> Bool {
    return self.signedInUser == nil
}

这会导致非常奇怪的错误消息:
“Type 'UIStatusBarStyle' does not conform to protocol 'NilLiteralConvertible'”。
我不想在"isSignedIn"方法中执行以下操作,因为这对于这个简单的任务来说太长了:
func isSignedIn() -> Bool {
    if let signedInUser = self.signedInUser {
        return true
    }

    return false
}

我这里有点不明白,我认为Swift可以让代码变得更加简短和简单。你会怎么做呢?


我找不到重复的问题,但这是 Beta 4 中的一个错误。最简单的解决方法是调用.getLogicValue或隐式使用它,例如 if signedInUser { - Sulthan
@Sulthan:我们如何知道当前的行为是 bug 而非功能?如果在之前的测试版中它能正常工作,这并不一定意味着当前版本有问题。不过谢谢你提供的其他帖子。getLogicValue() 方法很有帮助! - Jeehut
@Dschee 因为在苹果开发者论坛上已经确认,详见 https://devforums.apple.com/message/1000658#1000658 - Sulthan
你也可以使用 !!self.signedUser,但对于从未接触过Javascript的人来说,这是一个很粗糙的解决方法。 - Sulthan
我刚刚提交了一个错误报告,以确保这个问题被修复或者至少有所不同地解决。 #17868980 - Jeehut
@Sulthan:感谢提供链接!关于解决方法:请将其发布为答案,以便我可以投票支持。我认为这是一个有趣的解决方法。 :) - Jeehut
1个回答

2
也许三目运算符可以解决问题。
func isSignedIn() -> Bool {
    return self.signedInUser ? true : false
}

谢谢,这确实用一行代码解决了我的问题,尽管可能有更简洁的解决方案。但也许是因为语言/编译器还处于Beta状态,所以它还不能正常工作。只有时间能证明。 - Jeehut

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接