优雅地使用期权

时间:2017-09-30 17:19:38

标签: swift

我在一个返回total / count的类中有一个属性。 totalcount都是可选项。是否有一种更优雅的方式来检查它们是否具有这个值:

var equalAmount: Float? { 
    if total != nil, count != nil {
        return total! / Float(count!)
    } else {
        return nil
    }
}

4 个答案:

答案 0 :(得分:4)

几乎任何方式都比使用force-unwrap更优雅。请选择:

if let:最接近您当前的设计

if let total = total, let count = count {
    return total / Float(count)
} else {
    return nil
}

guard let:减少缩进

guard let total = total, let count = count else { return nil }
return total / Float(count)

mapflatMap:适用于单行

return total.flatMap { total in count.map { total / Float($0) } }

答案 1 :(得分:2)

ñ

这将是我的方法。当你真的需要变量来继续这个功能时,我会使用guard let。

答案 2 :(得分:0)

如果保护中的条件不为真,则使用guard let解包值,然后else部分将返回到该函数,这将不执行其中的另一个。与guard语句相比,if let更优选检查解包值并立即返回:

var equalAmount: Float? { 
    guard let newTotal = total else {
         return nil
    }
    guard let newCount = count else {
         return nil
    }

return newTotal/newCount

}

答案 3 :(得分:0)

使用三元条件运算符:

var equalAmount: Float? { 
    return total != nil && count != nil ? total! / Float(count!) : nil
}

文档:https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/BasicOperators.html