是否有一个函数返回+1的正数和-1的负数在Swift中?Swift中的“符号”函数
我查看了巨大的文件,如果你右键点击定义了一个典型的函数,但是如果它在那里,我不知道它的名字。
我这样做:
(num < 0 ? -1 : 1)
但我宁愿使用一个内置函数,如果有任何 - 在最小的自我记录的原因。
是否有一个函数返回+1的正数和-1的负数在Swift中?Swift中的“符号”函数
我查看了巨大的文件,如果你右键点击定义了一个典型的函数,但是如果它在那里,我不知道它的名字。
我这样做:
(num < 0 ? -1 : 1)
但我宁愿使用一个内置函数,如果有任何 - 在最小的自我记录的原因。
W.r.t.内置的功能,我想你会得到最接近的是Foundation
方法copysign(_: Double, _: Double) -> Double
let foo = -15.2
let sign = copysign(1.0, foo) // -1.0 (Double)
自然需要在情况下,一些类型的转换你不上号Double
类型的操作。
但是,我没有理由不创建自己的扩展以适合您的需求,特别是对于如sign
这样的简单函数,因为它们不需要臃肿,
extension IntegerType {
func sign() -> Int {
return (self < 0 ? -1 : 1)
}
/* or, use signature: func sign() -> Self */
}
extension FloatingPointType {
func sign() -> Int {
return (self < Self(0) ? -1 : 1)
}
}
(这里产生1
也为0
,如在你的问题的例子)。
(编辑对于下面的评论)
的替代解决方案上面会用的sign()
默认实现定义你自己的协议,使各类符合本协议将有权访问该方法sign()
。
protocol Signable {
init()
func <(lhs:Self, rhs:Self) -> Bool
}
extension Signable {
func sign() -> Int {
return (self < Self() ? -1 : 1)
}
}
/* extend signed integer types to Signable */
extension Int: Signable { } // already have < and init() functions, OK
extension Int8 : Signable { } // ...
extension Int16 : Signable { }
extension Int32 : Signable { }
extension Int64 : Signable { }
/* extend floating point types to Signable */
extension Double : Signable { }
extension Float : Signable { }
extension CGFloat : Signable { }
/* example usage */
let foo = -4.2
let bar = 42
foo.sign() // -1 (Int)
bar.sign() // 1 (Int)
我认为扩展是最终的方式,我只是完全惊讶这样的事情不存在!无论如何,有没有什么方法可以用这个泛型?或者数字类型是那些不是通用的“群集”的一部分? –
@MauryMarkowitz即使是一个自定义的全局'sign
FloatingPointType
有一个内置的计算变量,但它返回一个布尔值。如果你只需要在浮动此操作,您可以使用像这样的扩展:
extension FloatingPointType {
var signValue: Int {
return isSignMinus ? -1 : 1
}
}
然而,我认为最好的办法是延长SignedNumberType
协议。
extension SignedNumberType {
var signValue: Int {
return (self >= -self) ? 1 : -1
}
}
如果你想0返回-1则只是改变>=
到>
。
测试用例:
print(3.0.signValue)
print(0.signValue)
print(-3.0.signValue)
因为复制符号不能超过整数使用我使用这个扩展:
extension Comparable where Self: SignedNumber {
var sign: Int {
guard self != -self else {
return 0
}
return self > -self ? 1 : -1
}
}
的simd
库有一个标志方法:
import simd
sign(-100.0) // returns -1
sign(100.0) // returns 1
sign(0.0) // returns 0
如果你import SpriteKit
,你可以免费获得simd
。
在斯威夫特 - 4彩车有一个新的属性:
public var sign: FloatingPointSign { get }
耶!似乎是一个不费脑的... –
我们的心Swift4 – Fattie
那么,什么是有趣的是,我*不*要疯了,也算不上什么* *正是这样。非常令人惊讶。 –