2016-03-28 20 views
9

是否有一个函数返回+1的正数和-1的负数在Swift中?Swift中的“符号”函数

我查看了巨大的文件,如果你右键点击定义了一个典型的函数,但是如果它在那里,我不知道它的名字。

我这样做:

(num < 0 ? -1 : 1) 

但我宁愿使用一个内置函数,如果有任何 - 在最小的自我记录的原因。

+0

那么,什么是有趣的是,我*不*要疯了,也算不上什么* *正是这样。非常令人惊讶。 –

回答

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) 
    } 
} 

(这里产生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) 
+0

我认为扩展是最终的方式,我只是完全惊讶这样的事情不存在!无论如何,有没有什么方法可以用这个泛型?或者数字类型是那些不是通用的“群集”的一部分? –

+0

@MauryMarkowitz即使是一个自定义的全局'sign (arg:T)',也需要在'T'上包含一个类型约束,用于描述小于函数<<以及初始化的值的协议考虑为“零”。另外,我们需要扩展所有我们希望允许使用这个函数的类型到那个协议,这意味着所有Swift不同的int类型都有一些代码。在这种情况下,我认为在'IntegerType'和'FloatingPointType'上使用扩展(如上)是一个不太痛苦的选择。然而,我会列举一个使用这种方法的例子。 – dfri

4

用途:

let result = signbit(number) 

这将返回1为负数,0为阳性。

let number = -1.0 
print("\(signbit(number))") 

1 

let number = 1.0 
print("\(signbit(number))") 

0 
+0

这会返回0或1会不会? –

+0

是,1代表负数,0代表正数 – Masih

+0

请注意,它使用浮点型表示的数字的符号位,因此仅适用于浮点类型。为了测试一个整数的符号,在应用这个方法之前,你需要首先强制转换为Double。 – dfri

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) 
+0

'0.signValue'应该可能返回'0' – Clashsoft

+1

很可能,尽管我想它取决于你的具体用例。我正在执行与上面显示的示例一致的行为。 – Kevin

1

因为复制符号不能超过整数使用我使用这个扩展:

extension Comparable where Self: SignedNumber { 

    var sign: Int { 
     guard self != -self else { 
      return 0 
     } 
     return self > -self ? 1 : -1 
    } 
} 
3

simd库有一个标志方法:

import simd 

sign(-100.0) // returns -1 
sign(100.0) // returns 1 
sign(0.0) // returns 0 

如果你import SpriteKit,你可以免费获得simd

4

在斯威夫特 - 4彩车有一个新的属性:

public var sign: FloatingPointSign { get } 
+0

耶!似乎是一个不费脑的... –

+0

我们的心Swift4 – Fattie