2014-09-26 3 views
5

Я попытался сделать несколько простого макет UIView математики в быстром и попробовал следующую строку коды ...Каков наилучший способ сделать математику с CGFloats в swift?

var offset: CGFloat = (bounds.width/2.0) - ((sortedSymptoms.count * bounds.height)/2.0) 

и получил следующее сообщение об ошибке от компилятора:

cannot invoke '-' with an argument list of type '(($T6), ($T17))' 
     var offset: CGFloat = (bounds.width/2.0) - ((sortedSymptoms.count * bounds.height)/2.0) 
           ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  

Компилятор ошибки ISN Все это полезно, но похоже, что существует конфликт типов между Double, Int и CGFloat. Мне удалось собрать эту строку, посылая некоторые явные творения CGFloats, но я не могу поверить, что это правильный способ сделать это.

var offset: CGFloat = (bounds.width/CGFloat(2.0)) - ((CGFloat(sortedSymptoms.count) * bounds.height)/CGFloat(2.0)) 

Каков правильный путь?

ответ

7

Это известная проблема в Swift, и команда разработчиков работает над улучшением проблемы около CGFloat в частности. Но в это время, да, вот как вы его пишете.

Некоторые Followup из devforums (который может сделать вас счастливым или грустным, но, по крайней мере, примерно объясняет текущее состояние): https://devforums.apple.com/message/1026028#1026028

Обратите внимание, что главная проблема в том, что буквальный 2,0 не принуждать к CGFloat, которые, возможно, должны. Но count, скорее всего, всегда потребует броска, по замыслу. Вы не всегда можете безопасно конвертировать между числовыми типами, а Swift преднамеренно заставляет вас учитывать каждый раз, когда вы делаете эти виды бросков. Но должно быть возможно определить, является ли буквальное преобразование безопасным во время компиляции, поэтому оно должно быть исправлено.

+0

Спасибо за ссылку devforums, да, это противно, но имеет смысл. Надеюсь, они придумают элегантное решение, и я надеюсь, что нам не нужно ждать следующего WWDC, прежде чем мы сможем его использовать. –

Смежные вопросы