Recebo o seguinte erro ao usar o código para uma extensão. Não tenho certeza se eles estão pedindo para usar apenas um operador diferente ou modificar os valores na expressão com base em uma pesquisa na Internet.
Erro:% não está disponível: use truncatingRemainder ao invés
Código de extensão:
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)
}
}
}
O (s) erro (s) ocorrem ao definir as variáveis de minutos e segundos.
%
operador não está disponível e você deve considerar o uso de algo como otruncatingRemainder
método.Float64
masInt
apenas ligado ; portanto:let minutes:Int = Int(totalSeconds) % 3600 / 60; let seconds:Int = Int(totalSeconds) % 60
é a maneira correta.Respostas:
CMTimeGetSeconds()
retorna um número de ponto flutuante (Float64
também conhecido comoDouble
). No Swift 2, você pode calcular o resto de uma divisão de ponto flutuante comoNo Swift 3, isso é feito com
Aplicado ao seu código:
No entanto, neste caso específico, é mais fácil converter a duração em um número inteiro em primeiro lugar:
Então, as próximas linhas simplificam para
fonte
O
%
operador módulo é definido apenas para tipos inteiros. Para tipos de ponto flutuante, você precisa ser mais específico sobre o tipo de comportamento de divisão / resto IEEE 754 que deseja, portanto, é necessário chamar um método:remainder
outruncatingRemainder
. (Se estiver fazendo matemática de ponto flutuante, você realmente precisa se preocupar com isso e muitas outras coisas , ou você pode obter resultados inesperados / ruins.)Se você realmente pretende fazer o módulo inteiro, é necessário converter o valor de retorno de
CMTimeGetSeconds
para um inteiro antes de usar%
. (Observe que se você fizer isso, você cortará os segundos fracionários ... dependendo de onde você estiver usandoCMTime
isso pode ser importante. Você quer minutos: segundos: quadros, por exemplo?)Dependendo de como você deseja apresentar os
CMTime
valores em sua IU, pode ser melhor extrair o valor de segundos e passá-lo paraNSDateFormatter
ouNSDateComponentsFormatter
para obter o suporte de localidade apropriado.fonte
Traga de volta a sintaxe do módulo simples no swift 3:
Esta sintaxe foi sugerida na lista de discussão oficial do Swift da Apples aqui , mas por algum motivo, eles optaram por uma sintaxe menos elegante.
Esta dica simples de migração do Swift 3 é parte de um guia de migração do Swift 3 mais abrangente com muitos insights (35k loc / 8 dias de migração) http://eon.codes/blog/2017/01/12/swift-3-migration /
fonte
remainder(dividingBy:)
etruncatingRemainder(dividingBy:)
. Você pode querer ler a documentação de ambos. Além disso, consulte a mesma pergunta para C ++ stackoverflow.com/questions/6102948/…Descobri que o seguinte funciona no Swift 3:
onde
totalSeconds
está umTimeInterval
(Double
).fonte
totalSeconds = 59.8
seu código calcula 0 minutos e 0 segundos.round
não é necessário.Não há necessidade de criar um operador de módulo separado para números de ponto flutuante, a menos que você ache que isso torna o código mais seguro. Você pode sobrecarregar o
%
operador para aceitar números de ponto flutuante como:Uso
Agora você pode usar
%
com quaisquer dois números de ponto flutuante do mesmo tipo.fonte