“%is unavailable:使用truncatingRemainder”是什么意思?

使用扩展名代码的时候,我得到了下面的错误,我不确定他们是否要求使用不同的操作符,或者修改基于互联网search的expression式中的值。

错误:%不可用:改为使用truncatingRemainder

扩展代码:

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

设置分钟和秒variables时发生错误。

CMTimeGetSeconds()返回一个浮点数( Float64 aka Double )。 在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 

%模数运算符仅针对整数types定义。 对于浮点types,您需要更具体地了解所需的IEEE 754除法/余数行为,因此您必须调用一个方法: remaindertruncatingRemainder 。 (如果你正在做浮点math,你实际上需要关心这个,还有很多其他的东西 ,否则你会得到意想不到的结果。

如果你真的打算做整数模数,你需要在使用%之前将CMTimeGetSeconds的返回值转换为一个整数。 (请注意,如果你这样做,你会放弃小数秒…取决于你使用CMTime ,这可能是重要的,你想分钟:秒:帧,例如?)

根据你想如何在你的UI中呈现CMTime值,最好是提取秒值并将其传递给NSDateFormatterNSDateComponentsFormatter以便获得适当的语言环境支持。

在swift 3中带回简单的模态语法:

这个语法实际上是在苹果官方的swift邮件列表上build议的,但是由于某些原因,他们select了一个不太优雅的语法。

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

这个简单快速的3迁移技巧是更全面的快速迁移指南的一部分,有许多见解(35k loc / 8天的迁移) http://stylekit.org/blog/2017/01/12/swift-3-migration /

我发现以下Swift 3中的作品:

  let minutes = Int(floor(totalSeconds / 60)) let seconds = Int(totalSeconds) % 60 

totalSecondsTimeIntervalDouble )。