为什么这个基本类型扩展不起作用?

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