2014-12-24 6 views
0

다음 스위프트 코드는 컴파일에 실패하고 단순히 문제가 무엇을 볼 수 없습니다 :신비한 부동 소수점 변환 오류가

while fabsf(newPercentage - percentage) < 0.006 { 
    newPercentage = ((CGFloat)(arc4random() % 220) - 110) * 0.0001; 
} 

첫 번째 줄 다음과 같은 컴파일 오류 메시지가 : 함께 '<'을 호출 할 수 없음을 'Float, FloatLiteralConvertible'형식의 인수 목록

그러나 fabsf는 Float를 반환하고 내 상수는 Float이므로 이해할 수 없습니다.

CGFloat percentage = 0.0f; 
for (NSInteger i = 0; i < RotationCount; i++) { 
    // ensure that each angle is different enough to be seen 
    CGFloat newPercentage = 0.0f; 
    do { 
     newPercentage = ((CGFloat)(arc4random() % 220) - 110) * 0.0001f; 
    } while (fabsf(percentage - newPercentage) < 0.006); 
    percentage = newPercentage; 

    CGFloat angle = 2 * M_PI * (1.0f + percentage); 
    CATransform3D transform = CATransform3DMakeRotation(angle, 0.0f, 0.0f, 1.0f); 

    [rotations addObject:[NSValue valueWithCATransform3D:transform]]; 
} 
+0

'newPercentage'와'percentage'에 대한 선언을 보여주세요. – matt

+0

방금 ​​Objective-C 코드의 전체 섹션을 추가했습니다. Swift로 번역하려고합니다. – Sebastien

답변

1

문제는 당신 newPercentagepercentage가 수레 아니라는 것이다 : 향후 참조를 위해

, 여기에 내가 스위프트로 변환 할 노력하고있어 목표 - C 코드입니다. 그들은 CGFloat입니다. 큰 차이가 있습니다.

while fabsf(Float(newPercentage - percentage)) < 0.006 {} 

또한, 그것은 당신에 대해 무엇을 요구하지 않지만 변환 기술을 주 - 이전에서 초기화 된 새로운 객체를 생성 : 당신은 여기에 플로트를 작성해야합니다. 당신의이 코드는 스위프트되지 않습니다 : 당신은 여전히 ​​정신이 캐스트 변환하고 캐스팅이 괄호 형식의 이름을 넣어 완료 C와 목표 - C의 세계에 살고있다

(CGFloat)(arc4random() % 220) 

. 스위프트에는 그 누구도 없습니다.

+0

그렇다면 컴파일러가'fabsf '? 이 에러는''Float' ('fabsf'의 결과) 형과'FloatLiteralConvertible' 형의 인수를 가지고'<'를 호출하는 것에 대해 불평합니다. 이것은'<'가 처리 할 수있을 것으로 기대하는 것처럼 들립니다. –

+0

이상한 점은 백분율과 newPercentage가 모두 'var percentage = 0.0'으로 선언되었으므로 둘 다 Floats라고 생각할 수 있습니다. 사실 컴파일러는 fabsf에 대한 논쟁에 대해 불평하지 않았습니다. 그러나 newPercentage - percentage 주위에 Float()를 추가하면 컴파일러는 더 이상 불평하지 않습니다. 다른 캐스팅 주석에 대해, 맞습니다. 실제로 튜토리얼의 Objective-C 코드를 Swift 코드로 변환하고 있습니다. – Sebastien

+1

"나는 생각할 것이다". 그것도 한푼도 당신에게 전화를 안해. 생각하지 마라. 알고있다. 기본적으로'percentage'는 그 방법이 Float가 아닌 Double이 될 것이라고 선언했습니다. 어느 쪽이든, 내 대답이 적용됩니다. – matt

0

다음은 질문에 게시 된 Objective-C 코드의 전체 번역입니다. 가능한 가장 단순한 것인지는 모르겠지만 컴파일하는 것입니다.

var percentage:Float = 0.0 
for var i = 0; i < RotationCount; i++ { 
    var newPercentage:Float = 0.0 
    do { 
     newPercentage = Float(Int(arc4random() % 220) - 110) * 0.0001; 
    } while fabsf(Float(newPercentage - percentage)) < 0.006 
    percentage = newPercentage 

    var angle = 2.0 * Float(M_PI) * (1.0 + percentage) 
    var transform = CATransform3DMakeRotation(CGFloat(angle), 0.0, 0.0, 1.0) 
    self.rotations.append(transform) 
} 

정말 고통 스럽기 때문에 애플이 모든 암시 적 타입 변환을 쉽게하기를 바랍니다.

+0

글쎄, 난 그들이 갈 생각하지 않아요. 내 질문 및 답변보기 : http://stackoverflow.com/questions/24108827/swift-numerics-and-cgfloat-cgpoint-cgrect-etc 당신은 ' 언어는 너무 많은 수의 숫자 변환으로 존재할 수 있다고 생각하지만, Swift는 그렇게하므로 익숙해 져야합니다. – matt

+0

오, 그리고 잊었습니다. 원숭이의 세계에 손을 번역하는 것을 환영합니다 목표 -C에서 스위프트로.:) – matt

+0

따뜻한 환영에 감사드립니다. 그건 그렇고, 스위프트와 친해지 기 위해 당신의 책을 읽었습니다. 멋진 일. – Sebastien

관련 문제