我正在将我的代码从Objective-C转换为Swift。我声明了一个函数来比较两个属性的值并返回@randomUserId =rand(1..30)
。
我很困惑为什么这段代码在Swift中不起作用。
Bool
编译器给了我一个错误:
找不到接受提供的参数的<=的重载
感谢。
答案 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.location
(Int
)与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
确实需要UInt
,map
另一种类型的选项可以比较它们:
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
}