Ошибка 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.

Мне нравится 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

Поделиться

Ещё вопросы

  • 0JQuery зависимые поля выбора (выбраны)
  • 0Об обработке исключений в C ++
  • 1Печать заявления только один раз в цикле
  • 0AngularJS не будет переключать вид
  • 1Мой предварительный просмотр камеры растянут и сжат. Как я могу решить эту проблему?
  • 0Преобразовать код GIF в изображение GIF или вывести в файл?
  • 0Fullcalendar mousewheel event prev next
  • 0Использование массива в качестве условия в предложении where codeigniter
  • 1Как передать переменные из одного JSP в другой, не делая их переменными сеанса?
  • 0Значение неинициализированного поля в классе
  • 1Почему эмулятор не получает FCM Push
  • 0Codeigniter возвращает false из моделей
  • 1Лучший способ написать для цикла при возможности доступа к элементам в контейнере Python
  • 0Laravel репозиторий для рекурсивной функции меню
  • 0Попытка использовать кнопку, чтобы установить значение в $ scope
  • 1Остановить RegEx каждый раз, когда находит определенную строку
  • 0AngularJS / Javascript — Как я могу заменить весь объект на JSON
  • 1C # правильный синтаксис foreach для перебора списка
  • 0Как переименовать ссылки с вопросительным знаком?
  • 0Возврат и передача массива для работы в C ++
  • 1Логическое выражение Python
  • 0MySQL провайдер данных .NET Core 2.0
  • 1Android Kotlin — пойманное исключение, по-прежнему вылетает программа
  • 0JQuery датчик для координат
  • 1Java-код для отображения цикла
  • 0Jquery переключение анимации слева направо
  • 1Раскраска текста RichTextBox имеет другое поведение при добавлении в конструктор Form
  • 0Jquery Выбрать альтернативу в AngularJS
  • 1«Ни один экземпляр типа Hra не доступен».
  • 1Избегайте утечки памяти в клиенте c # неуправляемой DLL с утечкой памяти
  • 0Открыть модал в определенную дату / время [дубликаты]
  • 1Bluetooth печать в C # Windows Mobile
  • 0Слайдер изображений Nav Links Перейти к Anchor DIVs
  • 1Android XML динамически устанавливает высоту полей
  • 1невозможно скомпилировать Java-класс, когда код взаимосвязан
  • 1Re.search в регулярных выражениях Python не работает, как задумано
  • 0Слайд div слева направо в угловом
  • 0Передача массива в качестве аргумента в параметризованный конструктор
  • 1Зачем закрывать выпадающий список, когда я нажимаю на открытый модал?
  • 0Проверка Javascript перед сохранением информации
  • 1Прогнозирование отсутствия активности клиентов
  • 0Невозможно создать запрошенный сервис [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] (при попытке использовать EntityManager)
  • 0Рекомендуемая угловая практика для $ http в контроллере или сервисе
  • 0Добавление коробки количества к списку товаров magento
  • 0Mysql консоль резервного копирования сбой в правильном каталоге с правильным паролем
  • 0Автоматическое обновление позиции пользователя на основе итоговой оценки с помощью PHP и MySQL
  • 1Модуль Android Studio Gradle чистой установки дает ошибку com.android.volley не существует
  • 1Почему это значение возвращает ноль?
  • 1Добавить кнопку в верхней части макета кадра
  • 6Невозможно разместить запрошенные классы в одном файле dex, даже для более ранних коммитов, которые скомпилировались ранее

Сообщество Overcoder

Вопрос:

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

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, не конвертируемой

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

Из соображений безопасности в 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))
}

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

Ответ №1

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

Единственными “естественными” типами являются 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))
}

Ответ №2

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

Из соображений безопасности в 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))
}

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

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?

Понравилась статья? Поделить с друзьями:
  • Ошибка value is not an object
  • Ошибка unreal engine 4 crash reporter как исправить
  • Ошибка value if not set перевод
  • Ошибка unreal engine 4 crash reporter satisfactory
  • Ошибка utweb exe как убрать