&引用;签署「;Swift中的功能
在Swift中是否有一个函数返回+1表示正数,返回-1表示负数 我浏览了一个巨大的文件,如果你在一个典型函数上右键单击->定义,它就会出现,但是如果它在那里,我不知道它的名字 我这样做:&引用;签署「;Swift中的功能,swift,Swift,在Swift中是否有一个函数返回+1表示正数,返回-1表示负数 我浏览了一个巨大的文件,如果你在一个典型函数上右键单击->定义,它就会出现,但是如果它在那里,我不知道它的名字 我这样做: (num < 0 ? -1 : 1) (数值Double let foo = -15.2 let sign = copysign(1.0, foo) // -1.0 (Double) 自然需要一些类型转换,以防您没有操作多个类型Double 然而,我认为没有理由不创建适合您需要的扩展,特别是对于像si
(num < 0 ? -1 : 1)
(数值<0?-1:1)
但我宁愿使用内置函数(如果有的话)——至少出于自我记录的原因。使用:
let result = signbit(number)
这将返回1表示负数,0表示正数
let number = -1.0
print("\(signbit(number))")
1
let number = 1.0
print("\(signbit(number))")
0
斯威夫特4
正如已经在中指出的,现在有一个:
浮动点符号
浮点值的符号
列举个案
- case
表示负值的符号减号
- case
表示正值的符号加上
斯威夫特3 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)
}
}
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)
由于copysign不能用于整数,因此我使用此扩展名:
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
如果您在Swift-4浮动中导入SpriteKit,您将免费获得
simd
,,并拥有一个新属性:
public var sign: FloatingPointSign { get }
(但是,这只检查符号位,因此在某些情况下,如
-0
-请参见上面接受的答案)这将返回0或1,不是吗?请注意,这将使用符号位表示浮点模式表示的数字,因此仅适用于浮点类型。为了测试一个整数的符号,在应用此方法之前,您需要先将其转换为Double
。@Masih但问题是-1或1,而不是1或0。显然,它可以简单地改变,但OP已经可以做到这一点。他正在寻找一个这样的基础方法。<代码> 0。我实现的行为与上面的例子一致。所以有趣的是,我没有发疯,实际上并没有这样的事情。非常令人惊讶。我认为扩展是最终的方向,我只是完全惊讶这样的事情还不存在!在任何情况下,有没有办法使用泛型?或者数字类型是那些不是真正通用的“集群”的一部分?@MauryMarkowitz甚至是一个自定义的全局符号(arg:t)
对于设计小于函数的协议,需要在T
上包含一个类型约束we heart Swift4请务必注意,sign
属性描述浮点值的signbit,这与测试“值是否为负值”不一定相同(请参阅中的详细信息)。
extension Comparable where Self: SignedNumber {
var sign: Int {
guard self != -self else {
return 0
}
return self > -self ? 1 : -1
}
}
import simd
sign(-100.0) // returns -1
sign(100.0) // returns 1
sign(0.0) // returns 0
public var sign: FloatingPointSign { get }