Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;签署「;Swift中的功能_Swift - Fatal编程技术网

&引用;签署「;Swift中的功能

&引用;签署「;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

在Swift中是否有一个函数返回+1表示正数,返回-1表示负数

我浏览了一个巨大的文件,如果你在一个典型函数上右键单击->定义,它就会出现,但是如果它在那里,我不知道它的名字

我这样做:

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