比较值并在Swift中返回一个bool

时间:2015-06-15 02:21:05

标签: swift boolean

我正在将我的代码从Objective-C转换为Swift。我声明了一个函数来比较两个属性的值并返回@randomUserId =rand(1..30)。 我很困惑为什么这段代码在Swift中不起作用。

Bool

编译器给了我一个错误:

  

找不到接受提供的参数的<=的重载

感谢。

2 个答案:

答案 0 :(得分:1)

Swift有运算符重载,所以==是一个函数。您必须定义一个采用两种类型的函数。

如果你删除了它的工作原理:

class Document {
    private var currentLineRange: NSRange?
    var location: Int?

    func atBeginningOfLine() -> Bool {
        if let currentLocation = self.location, lineRange = self.currentLineRange {
            return currentLocation=lineRange?.location
        } else {
            return false
        }
    }
}

修改为null安全。

答案 1 :(得分:1)

您有两个可选值,您想检查它们是否相等。有一个版本==用于比较两个选项 - 但它们必须属于同一类型。

这里的主要问题是您将NSRange.locationInt)与location进行比较,即UInt。如果你试图这样做,即使没有选项的复杂性,你会收到一个错误:

let ui: UInt = 1
let i: Int = 1
// error: binary operator '==' cannot be applied to operands of 
// type 'Int' and ‘UInt'
i == ui  

你有两种方法可以去。将location更改为Int,您就可以使用可选的==

private var currentLineRange: NSRange?
var location: Int?

func atBeginningOfLine() -> Bool {
    // both optionals contain Int, so you can use == on them:
    return location == currentLineRange?.location
}

或者,如果由于某些其他原因location确实需要UIntmap另一种类型的选项可以比较它们:

private var currentLineRange: NSRange?
var location: UInt?

func atBeginningOfLine() -> Bool {
    return location.map { Int($0) } == currentLineRange?.location
}

要注意的一件事 - nil等于nil。所以如果你不想要这个(取决于你想要的逻辑),你需要明确地为它编码:

func atBeginningOfLine() -> Bool {
    if let location = location, currentLineRange = currentLineRange {
        // assuming you want to stick with the UInt
        return Int(location) == currentLineRange.location
    }
    return false // if either or both are nil
}