programing

%를(를) 사용할 수 없음:자르기Remainer를 대신 사용합니다."는 다음을 의미합니까?

newsource 2023. 9. 27. 17:57

%를(를) 사용할 수 없음:자르기Remainer를 대신 사용합니다."는 다음을 의미합니까?

확장 코드를 사용할 때 다음 오류가 발생합니다. 다른 연산자를 사용하라는 것인지 인터넷 검색을 기반으로 식의 값을 수정하라는 것인지 잘 모르겠습니다.

오류: %를(를) 사용할 수 없습니다.잘라내기잔여를 대신 사용

확장 코드:

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

분 및 초 변수를 설정할 때 오류가 발생합니다.

CMTimeGetSeconds()부동 소수점 번호()를 반환합니다.Float64아카Double스위프트 2에서 부동 소수점 분할의 나머지를 다음과 같이 계산할 수 있습니다.

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

스위프트 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

%모듈러스 연산자는 정수 형식에 대해서만 정의됩니다.부동 소수점 유형의 경우 원하는 IEEE 754 분할/잔여 동작의 종류를 보다 구체적으로 지정해야 하므로 메서드를 다음 중 하나 또는 .(부동 소수점 수학을 수행하는 경우에는 실제로 이 작업과 다른 많은 작업을 수행해야 하거나 예기치 않은/나쁜 결과를 얻을 수 있습니다.)

정수 계수를 실제로 수행하려는 경우 다음 값의 반환 값을 변환해야 합니다.CMTimeGetSeconds사용하기 전에 정수까지%. (만약 그렇게 한다면, 당신은 몇 초 안에...사용처에 따라CMTime중요할 수도 있습니다.분:초:프레임을 원하십니까?)

발표 방법에 따라CMTimeUI에서 값을 추출하여 적절한 로케일 지원을 받으려면 seconds 값을 추출하여 전달하는 것이 더 나을 수 있습니다.

swift 3의 간단한 modulo 구문을 다시 가져옵니다.

이 구문은 실제로 애플 공식 스위프트 메일링 리스트에 제안되었지만 어떤 이유에서인지 그들은 덜 우아한 구문을 선택했습니다.

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 마이그레이션 팁은 다양한 통찰력이 있는 보다 포괄적인 스위프트 3 마이그레이션 가이드의 일부입니다(35k loc / 마이그레이션 8일) http://eon.codes/blog/2017/01/12/swift-3-migration/

코드가 더 안전하다고 생각하지 않는 한 부동 소수점 번호를 위한 별도의 모듈로 연산자를 만들 필요가 없습니다.당신은 오버로드 할 수 있습니다.%연산자는 부동 소수점 번호를 다음과 같이 받아들입니다.

func %<N: BinaryFloatingPoint>(lhs: N, rhs: N) -> N {
    lhs.truncatingRemainder(dividingBy: rhs)
}

사용.

let a: Float80 = 10
let b: Float80 = 3
print(a % b)

이제 사용할 수 있습니다.%동일한 유형의 부동 소수점 번호 두 개를 사용할 수 있습니다.

스위프트 3에서는 다음과 같은 기능이 있음을 발견했습니다.

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

totalSecondsTimeInterval(Double).

언급URL : https://stackoverflow.com/questions/40495301/what-does-is-unavailable-use-truncatingremainder-instead-mean