当前位置: 首页 > 知识库问答 >
问题:

“%不可用:改用truncatingRemainder”是什么意思?

公德明
2023-03-14

当使用代码进行扩展时,我得到以下错误,我不确定他们是要求使用不同的操作符还是修改基于互联网搜索的表达式中的值。

错误:%不可用:请改用trunchingRemaider

扩展代码:

extension CMTime {
    var durationText:String {
        let totalSeconds = CMTimeGetSeconds(self)
        let hours:Int = Int(totalSeconds / 3600)
        let minutes:Int = Int(totalSeconds % 3600 / 60)
        let seconds:Int = Int(totalSeconds % 60)

        if hours > 0 {
            return String(format: "%i:%02i:%02i", hours, minutes, seconds)
        } else {
            return String(format: "%02i:%02i", minutes, seconds)
        }
    }
}

设置分钟和秒变量时出错。

共有3个答案

濮阳安澜
2023-03-14

这种语法实际上是在苹果官方的swift邮件列表中推荐的,但是出于某种原因,他们选择了一种不太优雅的语法。

infix operator %%/*<--infix operator is required for custom infix char combos*/
/**
 * Brings back simple modulo syntax (was removed in swift 3)
 * Calculates the remainder of expression1 divided by expression2
 * The sign of the modulo result matches the sign of the dividend (the first number). For example, -4 % 3 and -4 % -3 both evaluate to -1
 * EXAMPLE: 
 * print(12 %% 5)    // 2
 * print(4.3 %% 2.1) // 0.0999999999999996
 * print(4 %% 4)     // 0
 * NOTE: The first print returns 2, rather than 12/5 or 2.4, because the modulo (%) operator returns only the remainder. The second trace returns 0.0999999999999996 instead of the expected 0.1 because of the limitations of floating-point accuracy in binary computing.
 * NOTE: Int's can still use single %
 * NOTE: there is also .remainder which supports returning negatives as oppose to truncatingRemainder (aka the old %) which returns only positive.
 */
public func %% (left:CGFloat, right:CGFloat) -> CGFloat {
    return left.truncatingRemainder(dividingBy: right)
}

这一简单的swift 3迁移技巧是更全面的swift 3迁移指南的一部分,其中包含许多见解(35k loc / 8天迁移)http://eon . codes/blog/2017/01/12/swift-3-migration/

常永长
2023-03-14

% 模运算符仅针对整数类型定义。对于浮点类型,您需要更具体地说明所需的 IEEE 754 除法/余数行为类型,因此您必须调用一个方法:余数截断Remainder。(如果你正在做浮点数学,你实际上需要关心这个,以及很多其他的东西,否则你可能会得到意外/不好的结果。

如果您实际打算进行整数模运算,则需要先将CMTimeGetSeconds的返回值转换为整数,然后再使用%。(请注意,如果这样做,您将删除小数秒……这取决于您使用的CMTime的位置,这可能很重要。例如,您想要分钟:秒:帧吗?)

根据您希望在UI中呈现CMTime值的方式,最好提取秒值并将其传递给NSDateForwareNSDateComponentsForware,以便获得适当的语言环境支持。

充浩波
2023-03-14

CMTimeGetSeconds()返回一个浮点数(Float64akaDouble)。在Swift 2中,可以将浮点除法的余数计算为

let rem = 2.5 % 1.1
print(rem) // 0.3

在Swift 3中,这是用

let rem = 2.5.truncatingRemainder(dividingBy: 1.1)
print(rem) // 0.3

应用于您的代码

let totalSeconds = CMTimeGetSeconds(self)
let hours = Int(totalSeconds / 3600)
let minutes = Int((totalSeconds.truncatingRemainder(dividingBy: 3600)) / 60)
let seconds = Int(totalSeconds.truncatingRemainder(dividingBy: 60))

然而,在这种特殊情况下,首先将持续时间转换为整数更容易:

let totalSeconds = Int(CMTimeGetSeconds(self)) // Truncate to integer
// Or:
let totalSeconds = lrint(CMTimeGetSeconds(self)) // Round to nearest integer

然后下一行简化为

let hours = totalSeconds / 3600
let minutes = (totalSeconds % 3600) / 60
let seconds = totalSeconds % 60
 类似资料:
  • 问题内容: 使用扩展代码时,出现以下错误,我不确定他们是否要求使用其他运算符或基于Internet搜索修改表达式中的值。 错误:%不可用:改用truncatingRemainder 扩展码: 设置分钟和秒变量时会发生错误。 问题答案: 返回浮点数(aka )。在Swift 2中,您可以将浮点除法的余数计算为 在Swift 3中,这是通过 应用于您的代码: 但是,在这种特殊情况下,首先更容易将持续时

  • 这可能是有史以来问过的最愚蠢的问题,但我认为对于一个Java新手来说,这相当令人困惑。 有人能澄清什么是不可变的吗 一个很好的例子(在Java中)将非常感谢。

  • 问题内容: 作为Python的初级开发人员,我已经在控制台中多次看到此错误消息,但是我不完全了解它的含义。 谁能以一般的方式告诉我,哪种操作会产生此错误? 问题答案: 当您尝试使用 无法调用的对象时,会发生该错误。 可调用对象可以是函数或类(实现方法)。根据Python Docs : object . call (self [,args …]) :当实例被“调用”为函数时调用 例如: 不是可调用的

  • 问题内容: 我只是想使用Django中的url标记与另一个页面建立简单的连接。我收到“设置对象不可逆”的错误。搜索了一下之后,我一直找不到任何东西。 urls.py admin_view.html 我以前没有遇到过这个问题,而且看起来只是我要解决的一个简单问题。任何帮助表示赞赏。 问题答案: 应该是一个清单。您目前有一套。它应该是: 在模板中,当网址格式名称为字符串时,应使用引号: 如果要使用名称

  • 问题内容: 中的类对什么意味着什么?或者总的来说… 问题答案: 序列化将一个对象从内存持久存储到一系列位中,例如保存到磁盘上。反序列化是相反的-从磁盘读取数据以水合/创建对象。 就您的问题而言,它是一个接口,如果在一个类中实现,则该类可以由不同的序列化程序自动进行序列化和反序列化。

  • 问题内容: 我读到: 每当需要对集合进行排序时,元素必须相互可比。 我写了下面的代码,它可以正常工作。您能告诉我们b类和c类如何相互可比,“相互可比”是什么意思? 问题答案: 为了类和以可相互比较的,这些需求需要满足: 的通话上的一个实例,通过实例必须允许 的通话上的一个实例,通过实例必须允许 如果返回,则 必须 返回具有相反符号或零的值(当为零时)。 在你的代码中的类不可相互比较,因为试图通过一