为什么这个基本类型扩展不起作用?
Why doesn't this base type extension work?
尝试使用扩展程序,但在使用以下程序时遇到问题:
let value = -13
abs(value)
extension Int {
var abs:Int {
return abs(self) // -> Cannot invoke 'abs' with an argument list of type '(Int)'
}
}
value.abs
编译错误很奇怪,因为它明显地以 Int
作为参数直接运行上面的 abs()
函数。我猜我还有一些灯泡可以触发仿制药。开导我。
看来只是呼叫解析问题。这将起作用:
let value = -13
abs(value)
extension Int {
var abs1:Int {
return abs(self)
}
}
value.abs1
这也行得通:
extension Int {
var abs:Int {
return self < 0 ? -self : self
}
}
value.abs
这里的问题是您正在扩展 Int
以添加一个名为 abs
的变量——这也是您正在调用的函数的名称。
当您尝试在 Int
上调用函数 abs()
时,它会看到您创建的变量 abs
并且感到困惑,因为它认为您正在尝试 return那个变量,不明白你为什么要给它发送一个参数。
如果您将变量重命名为 absoluteValue
或其他任何名称,它应该可以正常工作。
let value = -13
abs(value)
extension Int {
var absoluteValue:Int {
return abs(self)
}
}
value.abs
更新: 正如其他人所说,您也可以通过显式调用Swift
框架内的函数来解决abs
的使用消歧.这应该与上述解决方案一样有效。
let value = -13
abs(value)
extension Int {
var abs:Int {
return Swift.abs(self)
}
}
value.abs
不过,就我个人而言,我仍然会像第一个示例一样将我的新函数重命名为 absoluteValue
,这样很明显您在使用 [=13 时不会调用 Swift.abs()
=]变量。
多亏了最初两个答案的方向(全局自由函数和我定义的 var 之间的冲突),它们必须被消除歧义。我可以使用 Swift
命名空间 abs()
来正确限定内部 abs()
的范围,而不是我自己内联实现 abs 或被迫使用不同的名称。
extension Int {
var absoluteValue:Int {
return Swift.abs(self)
}
}
这让我两全其美 (IMO)。
Swift 编译器对您将 abs
变量用作函数感到困惑,它不能这样做。现在您可以查看所有答案并重命名您的变量,但这些并不能深入了解 Swift 函数的工作原理。
Swift 自动导入 Swift
框架,它定义了它的静态函数。要使用这些函数,通常不需要指定它来自框架,但在这种情况下,您应该指定要使用来自 Swift
框架的 abs
方法。
所以在所有的解释之后,这是你的代码,它会起作用:
let value = -13
abs(value)
extension Int {
var abs: Int {
return Swift.abs(self)
}
}
value.abs
尝试使用扩展程序,但在使用以下程序时遇到问题:
let value = -13
abs(value)
extension Int {
var abs:Int {
return abs(self) // -> Cannot invoke 'abs' with an argument list of type '(Int)'
}
}
value.abs
编译错误很奇怪,因为它明显地以 Int
作为参数直接运行上面的 abs()
函数。我猜我还有一些灯泡可以触发仿制药。开导我。
看来只是呼叫解析问题。这将起作用:
let value = -13
abs(value)
extension Int {
var abs1:Int {
return abs(self)
}
}
value.abs1
这也行得通:
extension Int {
var abs:Int {
return self < 0 ? -self : self
}
}
value.abs
这里的问题是您正在扩展 Int
以添加一个名为 abs
的变量——这也是您正在调用的函数的名称。
当您尝试在 Int
上调用函数 abs()
时,它会看到您创建的变量 abs
并且感到困惑,因为它认为您正在尝试 return那个变量,不明白你为什么要给它发送一个参数。
如果您将变量重命名为 absoluteValue
或其他任何名称,它应该可以正常工作。
let value = -13
abs(value)
extension Int {
var absoluteValue:Int {
return abs(self)
}
}
value.abs
更新: 正如其他人所说,您也可以通过显式调用Swift
框架内的函数来解决abs
的使用消歧.这应该与上述解决方案一样有效。
let value = -13
abs(value)
extension Int {
var abs:Int {
return Swift.abs(self)
}
}
value.abs
不过,就我个人而言,我仍然会像第一个示例一样将我的新函数重命名为 absoluteValue
,这样很明显您在使用 [=13 时不会调用 Swift.abs()
=]变量。
多亏了最初两个答案的方向(全局自由函数和我定义的 var 之间的冲突),它们必须被消除歧义。我可以使用 Swift
命名空间 abs()
来正确限定内部 abs()
的范围,而不是我自己内联实现 abs 或被迫使用不同的名称。
extension Int {
var absoluteValue:Int {
return Swift.abs(self)
}
}
这让我两全其美 (IMO)。
Swift 编译器对您将 abs
变量用作函数感到困惑,它不能这样做。现在您可以查看所有答案并重命名您的变量,但这些并不能深入了解 Swift 函数的工作原理。
Swift 自动导入 Swift
框架,它定义了它的静态函数。要使用这些函数,通常不需要指定它来自框架,但在这种情况下,您应该指定要使用来自 Swift
框架的 abs
方法。
所以在所有的解释之后,这是你的代码,它会起作用:
let value = -13
abs(value)
extension Int {
var abs: Int {
return Swift.abs(self)
}
}
value.abs