Ошибка value is not convertible to uint

There is no implicit type conversion in Swift for safety reasons. You must convert deg to a Float. Literals don’t have an implicit type and can act as number of different types, but by initiating the division first, the type is chosen before it can be decided by the type of deg. Therefore, you must convert the result of M_PI/180.0 as well:

func degToRad(deg: Int) -> Float {
    return Float(deg) * Float(M_PI / 180.0)
}

And to potentially entice you with the language a bit more. Here is a handy enum for AngularMeasure:

enum AngularMeasure {
    case Degrees(CGFloat)
    case Radians(CGFloat)

    var degrees: CGFloat {
        switch (self) {
            case let .Degrees(value):
                return value
            case let .Radians(value):
                return value * CGFloat(180.0 / M_PI)
        }
    }

    var radians: CGFloat {
        switch (self) {
            case let .Degrees(value):
                return value * CGFloat(M_PI / 180.0)
            case let .Radians(value):
                return value
        }
    }
}

var measure : AngularMeasure = .Degrees(180)
println(measure.radians) // 3.14159274101257

Edit:

With your update, you are trying to call an instance method as a class method. You need to define your method as a class method:

class func degToRad(deg:Double) -> CGFloat {
    return CGFloat(deg*(M_PI/180.0))
}

Again, this is a terrible compiler error.

I can’t believe my comment has 7 down-votes. JSON is strongly typed. We have some helpers, and yes, as Billy says, our helpers imply that we can convert even more. But ultimately, a JSON «string» is a «string». You should not rely on the helpers, and you certainly should not complain when you mix types.

To reiterate, here are the original examples for this ticket:

stJsonRoot.get("int", 0).asInt();
stJsonRoot.get("float", 0.0f).asFloat();
stJsonRoot.get("bool", false).asBool();

Those are applied to

{"int":"123", "float":"1.34", "bool":"true"}

All three types are strings, but get() is called with non-string defaults. I would expect an exception to be thrown in each case. Maybe the exception should come on the get(), before asXXX(). Is that the complaint? I do not understand how anyone could argue that the above is legal code.

I would, however, expect the following to work:

stJsonRoot.get("int", "0").asInt();
stJsonRoot.get("float", "0.0").asFloat();
stJsonRoot.get("bool", "false").asBool();

Does it?

There is no implicit type conversion in Swift for safety reasons. You must convert deg to a Float. Literals don’t have an implicit type and can act as number of different types, but by initiating the division first, the type is chosen before it can be decided by the type of deg. Therefore, you must convert the result of M_PI/180.0 as well:

func degToRad(deg: Int) -> Float {
    return Float(deg) * Float(M_PI / 180.0)
}

And to potentially entice you with the language a bit more. Here is a handy enum for AngularMeasure:

enum AngularMeasure {
    case Degrees(CGFloat)
    case Radians(CGFloat)

    var degrees: CGFloat {
        switch (self) {
            case let .Degrees(value):
                return value
            case let .Radians(value):
                return value * CGFloat(180.0 / M_PI)
        }
    }

    var radians: CGFloat {
        switch (self) {
            case let .Degrees(value):
                return value * CGFloat(M_PI / 180.0)
            case let .Radians(value):
                return value
        }
    }
}

var measure : AngularMeasure = .Degrees(180)
println(measure.radians) // 3.14159274101257

Edit:

With your update, you are trying to call an instance method as a class method. You need to define your method as a class method:

class func degToRad(deg:Double) -> CGFloat {
    return CGFloat(deg*(M_PI/180.0))
}

Again, this is a terrible compiler error.

Из соображений безопасности в Swift нет неявного преобразования типов. Вы должны преобразовать deg в Float. Литералы не имеют неявного типа и могут действовать как количество разных типов, но, начав сначала разделение, тип выбирается прежде, чем его можно будет решить по типу deg. Следовательно, вы также должны преобразовать результат M_PI/180.0:

func degToRad(deg: Int) -> Float {
return Float(deg) * Float(M_PI / 180.0)
}

И потенциально соблазнить вас языком немного больше. Вот удобный перечисление для AngularMeasure:

enum AngularMeasure {
case Degrees(CGFloat)
case Radians(CGFloat)

var degrees: CGFloat {
switch (self) {
case let .Degrees(value):
return value
case let .Radians(value):
return value * CGFloat(180.0 / M_PI)
}
}

var radians: CGFloat {
switch (self) {
case let .Degrees(value):
return value * CGFloat(M_PI / 180.0)
case let .Radians(value):
return value
}
}
}

var measure : AngularMeasure = .Degrees(180)
println(measure.radians) // 3.14159274101257

Редактировать:

С помощью вашего обновления вы пытаетесь вызвать метод экземпляра как метод класса. Вы должны определить свой метод как метод класса:

class func degToRad(deg:Double) -> CGFloat {
return CGFloat(deg*(M_PI/180.0))
}

Опять же, это ужасная ошибка компилятора.

  

Helene1986

09.03.17 — 17:27

Добрый день!

Может кто сталкивался, при подключении ккм онлайн АТОЛ 30Ф к ут 10.3

смена открывается, но при пробитии чека вылезает ‘none’ is not a valid integer value

порты на кассе настроены верно, касса через личный кабинет видна, через тест драйвера чеки бьет, в кабинет отправляет.

в 1с выставила ЕНВД в настройках учетной политики и в настройке драйвера тоже

  

elCust

1 — 09.03.17 — 17:32

В обработчике драйвера все верно заполнено? Там еще есть вкладка налоги.

  

Helene1986

2 — 09.03.17 — 17:43

Вы имеете ввиду в параметрах фискализации?

  

renidok

3 — 13.03.17 — 14:30

Добрый день!

Вы решили эту проблему?

  

mexanik_96

4 — 13.03.17 — 14:35

‘none’ is not a valid integer value, похое фр хочет число а там null, ну пройдитесь под отладкой думаю сами поймете все…(например проверить параметры на входе объекта фр)

  

Rema Dan

5 — 20.03.17 — 14:31

При печати оплаты «без НДС» в драйвер должно передаваться ‘none’. Но драйвер АТОЛ’а начал поддерживать такую ставку только недавно.

Скорей всего обработка обслуживания содержит в себе старый вариант компоненты, а 1С уже посылает описание чека по новому. Нужно подключить свежую обработку обслуживания ФР или взять dll из установленных драйверов АТОЛ’а и запихать её в архив внутри обработки обслуживания.

  

Caesar

6 — 20.03.17 — 17:02

Здравствуйте.

У нас та же проблема, возникла после обновления Розницы на 2.2.5.25, драйверы АТОЛ обновили до 8.0.14.0, проблема не решилась. Есть какие-то рекомендации у кого-нибудь?

Розница базовая.

(1) Где находится вкладка «Налоги»?

  

Caesar

7 — 20.03.17 — 17:06

Виноват, не совсем сюда…

  

Helene1986

8 — 21.03.17 — 14:24

(5) Добрый день! обработку подключала от последнего обновления 1с

  

Helene1986

9 — 21.03.17 — 14:25

(6) налоги в настройках драйвера

  

1Снеговик

10 — 21.03.17 — 14:29

Возможно УТ 10.3 еще должны допилить, в Рознице 2.2 только в последнем обновлении реализовали корректную отправку ставок 0% и БезНДС.

Драйвер 8.12 встроенный у всех стоит? из 10.3.40.1?

  

Helene1986

11 — 21.03.17 — 15:09

(10) да, только возможно нужно еще вот это поставить FR-ATOL_54FZ

  

Rema Dan

12 — 21.03.17 — 16:04

(11)

Качать FR-ATOL_54FZ с сайта АТОЛа сейчас уже не нужно. содержимое этого архива вшивается в обработку обслуживания.

(10)

Ошибка в названии темы однозначно говорит о том, что УТ отправляет ставку НДС при печати чека по новому, а компонента зашитая в обработку печати этого не понимает.

Обработка обслуживания ФР из УПП 1.3.88.2 точно содержит нужную компоненту. Попробуйте с ней.

  

1Снеговик

13 — 21.03.17 — 16:14

(12) может потому что надо удалить старую настройку и перенастроить с новой компонентой. Сама она не обновляется, пока новую настройку ККМ не сделаешь.

  

Rema Dan

14 — 21.03.17 — 16:21

(13)

Мне не потребовалось трогать настройки. После загрузки свежей обработки обслуживания проблема ушла.

Разработчики конфигураций просто добавили поддержку чеков «без НДС» до того как это появилось в обработках обслуживания.

Для устранения проблемы должно исполниться 2 условия:

1. Драйвера ДТО 8.14+.

2. Обработка обслуживания с dll от февраля и старше.

  

Helene1986

15 — 21.03.17 — 19:20

(14) спасибо

  

maratik131

16 — 22.03.17 — 16:41

(14) Обработка обслуживания с dll от февраля и старше. Где ее достать?:)

  

Rema Dan

17 — 22.03.17 — 17:12

(16) В шаблонах конфигураций работающих с ФР (каталог TradeWareEpf) или, если есть доступ, то с офсайта (https://releases.1c.ru/project/TradeWareEpf82).

  

Zombi

18 — 23.03.17 — 17:52

УТ последний 41 релиз, обработки обслуживания обновил. Драйвер 8.14. Смена открывается и закрывается из УТ. Но при проведении чека «‘none’ is not a valid integer value». Что еще посмотреть?

  

Масянька

19 — 23.03.17 — 18:01

(17) Спасибо! За наводку.

  

Zombi

20 — 23.03.17 — 18:24

Подскажите, где взять ДЛЛ от февраля и старше? Обработка обслуживания у меня свежая есть. У нее в макете вижу файлик 1.2 метра весом. Это и есть та самая ДЛЛ? Как ее зарегистрировать? Я ее сохранил на диск, обозвал comp.dll и попытался зарегистрировать, винда ругнулась и ничего не зарегистрировала.

  

Rema Dan

21 — 24.03.17 — 12:48

(20) Этот файлик — это zip архив внутри которого лежит dll. Регистрировать её не нужно.

  

Zombi

22 — 24.03.17 — 13:14

(21) Точно. Спасибо.

  

Max Hell

23 — 28.03.17 — 11:39

Удалось заставить работать? У меня 77Ф, я уже и 8.14 поставил, и обработку Atolkkt заменял на от 10.3.41.01 (02.03.2017), и в нее засовывал длл-куиз шаблонов Розницы 2.2, один черт — «none is not valid integer value.»

либо «» is not valid integer value.

Такое впечатление, что это уже сам фискальник пургу несет…

  

Rema Dan

24 — 28.03.17 — 12:51

(23) Когда обработка загружается в базу, то на форме отображается версия обработки. Проблему устранили в версии 1.50. Актуальная на сегодняшний день версия 1.60. В поставке 10.3.41.01 лежит версия 1.30

  

rozer76

25 — 29.03.17 — 16:47

(24) и где взять актуальную Atolkkt версии 1.50 для ут10.3?

  

rozer76

26 — 29.03.17 — 16:50

+ (25) взял отсюда https://releases.1c.ru/project/TradeWareEpf82 но ошибка ‘none’ is not a valid integer value осталась. На форуме атола вообще говорят перепрошивать надо мой атол22птк

  

Asaqura

27 — 29.03.17 — 17:40

с ндс и без ндс такая ошибка?

  

lera01

28 — 29.03.17 — 17:49

Попробуйте еще посмотреть в учетной политике использование ЕНВД и УСН. В параметрах фискализации ККТ должно быть так же.

  

lera01

29 — 29.03.17 — 17:50

*в учетной политике  налогового учета

  

Kremiln

30 — 29.03.17 — 17:51

свежая прошивка аппарата решает эту проблему

  

Kremiln

31 — 29.03.17 — 17:54

Прошу прощения. Свежая прошивка решает проблему с открытием смены из 1С. В вашем случае dll надо подменить :)

  

rozer76

32 — 30.03.17 — 17:06

(31) см 26, уже. результата нет

  

rozer76

33 — 30.03.17 — 17:07

(32) протупил, я про обработку

  

rozer76

34 — 30.03.17 — 17:10

(31) обработку на сайте атола ?

    АТОЛ: Драйвер ККМ (54ФЗ) для 1С 8.x

    Программное обеспечениеДТО8.xFR-ATOL_54FZ.zip    Драйвер подключаемого оборудования 1С 8.x для ККТ АТОЛ (54ФЗ)    Драйвер         28.12.2016 18:24    1,20 Mb

  

Samoxa

35 — 03.04.17 — 02:16

Сделал проще. В 1С сервис-> торговое оборудование-> подключение и настройка торгового оборудования-> обработки обслуживания-> обновить все обработки обслуживания с сайта. Ну и там ввести логин и пароль пользователя зарегестрированного на сайте 1c.ru. После этого обработка atolkkt.epf c версии 1.30 поменялась на 1.50 и все заработало

  

Samoxa

36 — 04.04.17 — 00:32

  

Samoxa

37 — 04.04.17 — 00:33

  

France

38 — 04.04.17 — 00:42

атол? атол.. такой атол… случайно, нет ли проблем с правильной установкой драйверов?

  

Samoxa

39 — 04.04.17 — 01:27

(38) не наблюдалось

  

darius357

40 — 04.04.17 — 08:02

ну как всегда побакланили, и нифига толку

У меня есть некоторые очень неприятные проблемы с этой функцией:

func degToRad(deg:Int) -> Float {
    return deg*(M_PI/180.0)
}

На return линии я получаю сообщение об ошибке: 'Int' is not convertible to 'UInt8'

Это действительно сводит меня с ума. Это будет работать в Obj-C. Я действительно начинаю задавать вопрос Swift как язык…


ОБНОВИТЬ

Я обновил свою функцию:

func degToRad(deg:Double) -> CGFloat {
    return CGFloat(deg*(M_PI/180.0))
}

Но когда я пытаюсь использовать его так:

CGAffineTransformMakeRotation(CFunctions.degToRad(90))

Я получаю ту же ошибку, кроме Double → CGFloat, не конвертируемой

20 июль 2014, в 17:56

Поделиться

Источник

3 ответа

Из соображений безопасности в Swift нет неявного преобразования типов. Вы должны преобразовать deg в Float. Литералы не имеют неявного типа и могут действовать как количество разных типов, но, начав сначала разделение, тип выбирается прежде, чем его можно будет решить по типу deg. Следовательно, вы также должны преобразовать результат M_PI/180.0:

func degToRad(deg: Int) -> Float {
    return Float(deg) * Float(M_PI / 180.0)
}

И потенциально соблазнить вас языком немного больше. Вот удобный перечисление для AngularMeasure:

enum AngularMeasure {
    case Degrees(CGFloat)
    case Radians(CGFloat)

    var degrees: CGFloat {
        switch (self) {
            case let .Degrees(value):
                return value
            case let .Radians(value):
                return value * CGFloat(180.0 / M_PI)
        }
    }

    var radians: CGFloat {
        switch (self) {
            case let .Degrees(value):
                return value * CGFloat(M_PI / 180.0)
            case let .Radians(value):
                return value
        }
    }
}

var measure : AngularMeasure = .Degrees(180)
println(measure.radians) // 3.14159274101257

Редактировать:

С помощью вашего обновления вы пытаетесь вызвать метод экземпляра как метод класса. Вы должны определить свой метод как метод класса:

class func degToRad(deg:Double) -> CGFloat {
    return CGFloat(deg*(M_PI/180.0))
}

Опять же, это ужасная ошибка компилятора.

drewag
20 июль 2014, в 17:50

Поделиться

Дело в том, что нет никакого неявного литья числовых типов друг к другу. Литералы отлиты, потому что они не имеют фактического типа с самого начала, но переменные нет.

Единственными «естественными» типами являются Int и Double, а Float — ни один из них. Таким образом, чтобы вернуть Float, вам нужно передать весь результат в Float:

func degToRad(deg:Int) -> Float {
    return Float(deg*(M_PI/180.0))
}

Но даже этого будет недостаточно, потому что deg входит как Int, а M_PI и 180.0 — Double, поэтому его нужно также M_PI:

func degToRad(deg:Int) -> Float {
    return Float(Double(deg)*(M_PI/180.0))
}

matt
20 июль 2014, в 17:14

Поделиться

Сообщение об ошибке выглядит как текущий недостаток в компиляторе, но ошибка явно не лидирует deg на Float. В Swift нет неявного преобразования типов (телеологически, потому что ошибки, которые он иногда производит, не считаются достойными сокращения синтаксиса).

Tommy
20 июль 2014, в 16:20

Поделиться

Ещё вопросы

  • 1Использование интерфейса для коллекции <> универсальный тип
  • 0Сервер XAMPP (WAMP) — отключить доступ к файлам вне корневого каталога
  • 1Длительная работа потока, убитая PerformWaitCallback ()
  • 0Использование функции getchar ()
  • 1Добавьте еще одно поле параметра в тег выбора Struts2
  • 1Как правильно создать базу данных, используя подход кода структуры сущности
  • 1Как обрабатывать чередующиеся асинхронные функции в цикле while?
  • 1Как использовать функцию для импорта переменной в Python?
  • 1Объект типа ‘ndarray’ не поддерживает сериализацию в формате JSON
  • 1Как извлечь изображение / href url из класса div с помощью scrapy
  • 0повторное использование углового контроллера вызывает проблему области
  • 0Аутентификация пользователя Firebase с AngularFire
  • 1Как остановить приложение, если какие-либо действия были убиты ОС
  • 1Получить значения (почти) совпадающих ключей в 2 словарях и соединить их
  • 1скопировать содержимое статического массива из другого класса?
  • 0jTable: Как разделить ячейку таблицы в jTable, используя Jquery?
  • 1Программно редактировать таблицу Google
  • 1Python — конвертирует AAF в XML и читает метаданные для используемого аудио
  • 1Расширение Chrome запускается при запуске документа
  • 0Как автоматически включить GPS на Android?
  • 1Разбор XML в Windows Phone с использованием C #
  • 1Image.Source из растрового изображения не отображается
  • 1Использует ли HashMap HashSet для хранения своих ключей?
  • 0Медленный запрос с наличием на поле вычисления
  • 0Использование Direct2D через границы DLL
  • 1Частота и процент в dataframe.groupby с сортировкой
  • 1Преобразование из объекта в байтовый массив и обратно в Java
  • 0импортировать локальные подмодули в Android-проект JNI
  • 0Изменить внешний вид медиа fancyBox?
  • 0PHP и Javascript: получение содержимого файла с помощью переменной Javascript
  • 0горизонтальная анимация translate3d без анимации
  • 1Использование ExecutionEngine # execute (String) вне транзакции?
  • 0Установить переменную для конкретной страницы в jquery
  • 0MySQL объединяет два запроса в один запрос
  • 0Обновить нулевое поле из того же поля, если не ноль
  • 0Magento — Как использовать виджет ссылки товара для отображения «имя — цена» на главной странице
  • 1Повышение производительности веб-приложения на Java
  • 0Превратить текст шрифта в растровую графику?
  • 0как replcae ‘_’ Social_Science, используя регулярное выражение с пробелом?
  • 1Как удалить строку в TableLayout динамически
  • 1Сообщение SignalR не работает при отправке со стороны сервера клиенту
  • 1Отображение здоровья врага над врагом [работает, но не реально]?
  • 0Скрипт jQuery slideDown не работает в простом примере кода
  • 1main.js: 295 УДАЛИТЬ http://127.0.0.1:8081/messages/:0 405 (метод не разрешен) в Javascript
  • 0Преобразование из HTML в XHTML изменяет символ евро, предотвращая правильный синтаксический анализ XML
  • 1Как установить событие на сцене при перетаскивании мышью?
  • 0PHP получает выбранные строки таблицы из флажков
  • 1Python не может найти модуль в родительском каталоге
  • 0Сделать поиск в текстовом файле без учета регистра
  • 0php — пропустить foreach, если результат в том же значении

Сообщество Overcoder

Вопрос:

Я пытаюсь создать приложение для работы с использованием Xcode 6 и Swift. Я смог запустить приложение на Xcode 6 dp2, но после обновления до dp7 я получаю эту ошибку:

'bool' is not convertible to 'uint8'.

Вот функция с ошибкой:

 override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) {

**if ((segue && segue!.identifier == "showdetails") != nil)**{
var selectedIndexPath:NSIndexPath = self.tableView.indexPathForSelectedRow()

var detailViewController:DetailViewController = segue!.destinationViewController as DetailViewController

detailViewController.toDoData = toDoItems.objectAtIndex(selectedIndexPath.row) as NSDictionary

}

}

Лучший ответ:

Правильный способ написать это:

if (segue != nil && segue!.identifier == "showdetails") {

но еще лучший способ – использование необязательной привязки:

if let segue = segue {
    if (segue.identifier == "showdetails") {

Обратите внимание, что есть и другие ошибки в неправильном использовании опций. Это модифицированный код, который компилируется на игровой площадке:

if let segue = segue {
    if (segue.identifier == "showdetails") {
        var selectedIndexPath:NSIndexPath? = self.tableView.indexPathForSelectedRow()
        if let selectedIndexPath = selectedIndexPath {
            var detailViewController:DetailViewController = segue.destinationViewController as DetailViewController

            detailViewController.toDoData = toDoItems.objectAtIndex(selectedIndexPath.row) as NSDictionary
        }
    }
}

indexPathForSelectedRow возвращает необязательный параметр, поэтому вам нужно учитывать это.

Обновление: как было отмечено @MartinR, segue уже не обязательно, так что вы можете решить эту проблему простого обновления сигнатуры функции, и его реализация должна выглядеть следующим образом:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if (segue.identifier == "showdetails") {
        var selectedIndexPath = self.tableView.indexPathForSelectedRow()
        if let selectedIndexPath = selectedIndexPath {
            var detailViewController = segue.destinationViewController as DetailViewController                
            detailViewController.toDoData = toDoItems.objectAtIndex(selectedIndexPath.row) as NSDictionary
        }
    }
}

Ответ №1

Прежде всего, когда я прочитал документацию, что я читаю:

func prepareForSegue(_ segue: UIStoryboardSegue, sender sender: AnyObject?)

UIKit, похоже, обновляется в Beta7, чтобы использовать меньше опций. Таким образом, segue может быть необязательным.

Тогда, даже если ваша подпись функции хороша, вы сравниваете логическое значение с nil.

Это (segue && segue!.identifier == "showdetails") является логическим. Логическое значение имеет значение true или false.

И в самом конце, вот лучшая практика разворачивания переменной:

if let mySafeVariable = myOptionalVariable {
if mySafeVariable.attribute == <Whatever> {

}
}

Вам следует. Нет, подождите, вы должны прочитать бесплатные iBooks Swift.

У меня очень неприятные проблемы с этой функцией:

func degToRad(deg:Int) -> Float {
    return deg*(M_PI/180.0)
}

В строке return я получаю сообщение об ошибке: 'Int' is not convertible to 'UInt8'

Это действительно сводит меня с ума. Это будет работать в Obj-C. Я действительно начинаю сомневаться в Swift как в языке …


ОБНОВЛЕНИЕ

Я обновил свою функцию до этого:

func degToRad(deg:Double) -> CGFloat {
    return CGFloat(deg*(M_PI/180.0))
}

Но когда я пытаюсь использовать это так:

CGAffineTransformMakeRotation(CFunctions.degToRad(90))

Я получаю ту же ошибку, кроме Double -> CGFloat not convertible

3 ответа

Лучший ответ

В Swift нет неявного преобразования типов по соображениям безопасности. Вы должны преобразовать deg в Float. Литералы не имеют неявного типа и могут действовать как несколько разных типов, но, инициируя сначала деление, тип выбирается до того, как он может быть определен по типу deg. Следовательно, вы также должны преобразовать результат M_PI/180.0:

func degToRad(deg: Int) -> Float {
    return Float(deg) * Float(M_PI / 180.0)
}

И чтобы еще немного увлечь вас языком. Вот удобное перечисление для AngularMeasure:

enum AngularMeasure {
    case Degrees(CGFloat)
    case Radians(CGFloat)

    var degrees: CGFloat {
        switch (self) {
            case let .Degrees(value):
                return value
            case let .Radians(value):
                return value * CGFloat(180.0 / M_PI)
        }
    }

    var radians: CGFloat {
        switch (self) {
            case let .Degrees(value):
                return value * CGFloat(M_PI / 180.0)
            case let .Radians(value):
                return value
        }
    }
}

var measure : AngularMeasure = .Degrees(180)
println(measure.radians) // 3.14159274101257

Изменить:

В своем обновлении вы пытаетесь вызвать метод экземпляра как метод класса. Вам нужно определить свой метод как метод класса:

class func degToRad(deg:Double) -> CGFloat {
    return CGFloat(deg*(M_PI/180.0))
}

Опять же, это ужасная ошибка компилятора.


10

drewag
20 Июл 2014 в 20:25

Следует понимать, что не существует неявного преобразования числовых типов друг в друга. Литералы приводятся, потому что вначале они не имеют фактического типа, а переменные — нет.

Единственными «естественными» типами являются Int и Double, и ни один из них не является Float. Таким образом, чтобы вернуть Float, вам нужно преобразовать весь результат в Float:

func degToRad(deg:Int) -> Float {
    return Float(deg*(M_PI/180.0))
}

Но даже этого будет недостаточно, потому что deg входит как Int, а M_PI и 180.0 — как Double, поэтому его также необходимо преобразовать:

func degToRad(deg:Int) -> Float {
    return Float(Double(deg)*(M_PI/180.0))
}


4

matt
20 Июл 2014 в 19:56

Сообщение об ошибке выглядит как текущий недостаток компилятора, но ошибка не в явном преобразовании deg в Float. В Swift нет неявного преобразования типов (телеологически, потому что ошибки, которые он иногда создает, не считаются стоящими сокращения синтаксиса).


1

Tommy
20 Июл 2014 в 19:52

Мне нравится Swift, но его LogLevel is not convertible to UInt8 error преобразования числа начинают меня раздражать… Почему именно следующий код, приводящий к тому, что LogLevel is not convertible to UInt8 error (в инструкции if)?

import Foundation;

enum LogLevel : Int
{
    case System = 0;
    case Trace = 1;
    case Debug = 2;
    case Info = 3;
    case Notice = 4;
    case Warn = 5;
    case Error = 6;
    case Fatal = 7;
}

class Log
{
    struct Static
    {
        static var enabled:Bool = true;
        static var filterLevel:LogLevel = LogLevel.System;
    }

    public class func trace(data:AnyObject!)
    {
        if (Static.filterLevel > LogLevel.Trace) {return;}
        println("(data)");
    }
}

LogLevel типа Int должен быть равен LogLevel типа Int.

03 авг. 2014, в 14:32

Поделиться

Источник

2 ответа

«Перечисления в Swift — это первоклассные типы сами по себе».

Выдержка из: Apple Inc. «Быстрый язык программирования». интерактивные книги. https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewBook?id=881256329

Итак, перечисление не является int, и нет смысла выполнять математические сравнения на нем. У вас есть связанные значения с вашими значениями перечисления, поэтому вам нужно использовать функции toRaw и fromRaw для доступа к необработанным значениям.

public class func trace(data:AnyObject!)
{
    if (Static.filterLevel.toRaw() > LogLevel.Trace.toRaw()) {return;}
    println("(data)");
}

Paulw11
03 авг. 2014, в 12:45

Поделиться

Из книги Свифт:

Используйте функции toRaw и fromRaw для преобразования между необработанным значением и значением перечисления.

В твоем случае:

if Static.filterLevel.toRaw() > LogLevel.Trace.toRaw() {
    return;
}

Martin R
03 авг. 2014, в 12:46

Поделиться

Ещё вопросы

  • 0Почему значение файла cookie, который я устанавливаю (строка), увеличивается на единицу при установке из $ _GET?
  • 1VideoView воспроизводится нормально, но не отображается при переключении полноэкранных представлений
  • 0javascript / jquery получить значение переменной [дубликата]
  • 0добавление HTML выбора стран в несколько мест
  • 0Получить изображение SRC в рамках директивы
  • 0AngularJS не будет переключать вид
  • 0Показать вставленное изображение с предыдущей страницы
  • 0Вся страница печатается в IE при использовании плагина jQuery
  • 1Добавление идентификатора в информационное окно (API Google Maps)
  • 0Как можно эмулировать нажатие клавиатуры или мыши?
  • 1Оптимизация хвостового вызова в JavaScript не работает
  • 2отправка файла с модификацией 2, имя файла которого содержит персидский символ
  • 0Плагин jQuery, сохраняйте ссылку на оригинальный элемент
  • 0Отправка сообщения пользователю с помощью Facebook Graph API
  • 1Исполняемый файл ffmpeg не найден при компиляции с помощью cx_freeze
  • 1Полное удаление дублированных данных без сохранения одного
  • 1Как вставить общее количество страниц в нижний колонтитул каждой страницы документа iTextSharp? [Дубликат]
  • 0Как изменить данные JSON в Angularjs
  • 0mysql 0000-00-00 ошибка обновления
  • 0Создание редактируемых списков с использованием HTML и JQuery
  • 1Невозможно заставить Firebase работать без сборки Gradle: отсутствует google_app_id. Аналитика Firebase отключена
  • 1Передача сообщений между пулами процессов в многопроцессорной Python
  • 0Передача переменной в скрипт действия формы
  • 0установить дату в текстовом поле по клику
  • 1скачать номера в игровом магазине и играть в приставку разные
  • 0Uncaught TypeError: undefined не является функцией в AngularJS
  • 0не может скомпилировать opencv программы в ubuntu
  • 0Сохраните отфильтрованный список перед применением другого фильтра с помощью ng-repeat
  • 1Как совместить JLabel и JFrame?
  • 0Вставить несколько столбцов JSON в MySQL (используя API)
  • 1отображение списка возможностей программы
  • 0PHP Framework Zend не работает
  • 0Как сделать этот PHP, если оператор более простым и коротким?
  • 1Spinner с подчеркиванием и специальной стрелкой вправо
  • 0Сумма столбцов с использованием соединения
  • 0Как добавить идентификатор для элемента в JQuery
  • 0Как я могу загрузить файлы CoffeeScript из пакетов Bower с помощью веб-пакета?
  • 0Как преобразовать первые 15 символов в массиве символов в std :: string в C ++?
  • 0Переменная переопределяется в цикле
  • 0Объедините флажок jquery mobile в виде списка вместе со значком данных
  • 1Как определить, что для fillStyle был назначен недопустимый цвет?
  • 1Кэширование в памяти с ограничением по времени в python
  • 0Атрибут количества столбцов CSS3
  • 1openCv onCameraFrame пытается вызвать TextView.setText ()
  • 1Создание приложения Tkitner с несколькими окнами
  • 1Ошибка зависимости весны в моем файле POM
  • 0Преобразование координат SVG в координаты карты изображения HTML
  • 1Python Plotly Sankey Graph не отображается
  • 1Проблема с отображением приложения Android Studio
  • 1Нажмите для удаленного хранилища

Сообщество Overcoder

I can’t believe my comment has 7 down-votes. JSON is strongly typed. We have some helpers, and yes, as Billy says, our helpers imply that we can convert even more. But ultimately, a JSON «string» is a «string». You should not rely on the helpers, and you certainly should not complain when you mix types.

To reiterate, here are the original examples for this ticket:

stJsonRoot.get("int", 0).asInt();
stJsonRoot.get("float", 0.0f).asFloat();
stJsonRoot.get("bool", false).asBool();

Those are applied to

{"int":"123", "float":"1.34", "bool":"true"}

All three types are strings, but get() is called with non-string defaults. I would expect an exception to be thrown in each case. Maybe the exception should come on the get(), before asXXX(). Is that the complaint? I do not understand how anyone could argue that the above is legal code.

I would, however, expect the following to work:

stJsonRoot.get("int", "0").asInt();
stJsonRoot.get("float", "0.0").asFloat();
stJsonRoot.get("bool", "false").asBool();

Does it?

Из соображений безопасности в Swift нет неявного преобразования типов. Вы должны преобразовать deg в Float. Литералы не имеют неявного типа и могут действовать как количество разных типов, но, начав сначала разделение, тип выбирается прежде, чем его можно будет решить по типу deg. Следовательно, вы также должны преобразовать результат M_PI/180.0:

func degToRad(deg: Int) -> Float {
return Float(deg) * Float(M_PI / 180.0)
}

И потенциально соблазнить вас языком немного больше. Вот удобный перечисление для AngularMeasure:

enum AngularMeasure {
case Degrees(CGFloat)
case Radians(CGFloat)

var degrees: CGFloat {
switch (self) {
case let .Degrees(value):
return value
case let .Radians(value):
return value * CGFloat(180.0 / M_PI)
}
}

var radians: CGFloat {
switch (self) {
case let .Degrees(value):
return value * CGFloat(M_PI / 180.0)
case let .Radians(value):
return value
}
}
}

var measure : AngularMeasure = .Degrees(180)
println(measure.radians) // 3.14159274101257

Редактировать:

С помощью вашего обновления вы пытаетесь вызвать метод экземпляра как метод класса. Вы должны определить свой метод как метод класса:

class func degToRad(deg:Double) -> CGFloat {
return CGFloat(deg*(M_PI/180.0))
}

Опять же, это ужасная ошибка компилятора.

Понравилась статья? Поделить с друзьями:

Не пропустите эти материалы по теме:

  • Яндекс еда ошибка привязки карты
  • Ошибка update cpp 1202
  • Ошибка uo51 canon
  • Ошибка uo122 уаз патриот
  • Ошибка uo121 лада гранта

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии