1. ホーム
  2. ios

[解決済み] は使用できません。代わりにtruncatingRemainderを使用してください "とはどういう意味ですか?

2022-05-13 20:19:27

質問

拡張機能のコードを使用する際に以下のようなエラーが発生するのですが、インターネット検索で調べても、ただ別の演算子を使えということなのか、式の中の値を修正しろということなのか、よくわかりません。

エラー: % は使用できません。代わりに 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)
        }
    }
}

minutesとsecondsの変数設定時にエラーが発生しました。

解決方法は?

CMTimeGetSeconds() は浮動小数点数を返します ( Float64 別名 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