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

Поделиться

Ещё вопросы

  • 0Возможные причины множественного определения символа, отличного от ‘extern’
  • 1слушатель push-уведомлений sw-precache
  • 0Найдите поле ввода с определенным идентификатором и атрибутом обновления, используя jQuery
  • 0Как смоделировать нажатие клавиши или Keyup, когда ссылка нажата с помощью jQuery
  • 0Пройдите через n-арное дерево
  • 0Как использовать дополнительные значения в маршрутах Laravel?
  • 0Как открыть частичное представление с помощью $ window.open ()?
  • 1Сбой Android Lint для скриптов Gradle на основе Kotlin
  • 0MySQL меняет уникальный ключ на основной (mariadb)
  • 0Невозможно отправить почту C ++
  • 0Работа со ссылочными переменными в C ++
  • 0Изменить цвет метки на активном поле ввода
  • 1ПИТОН Как сделать «ассоциативный массив»
  • 1Лучшее использование абстрактных классов переопределения в приложении
  • 1Установленные флажки в списке через запятую со словом «и» в конце на C #
  • 0g ++: CreateProcess: нет такого файла или каталога [дубликата]
  • 1Правила безопасности Firestore request.query.orderBy не работает
  • 1Таймеры перезапускаются «для петель»? Я пытаюсь сделать таймер, чтобы панель циклически перебирала 5 разных цветов через заданный интервал времени.
  • 1Прочитать тег NFC от Xamarin
  • 1Поиск не является ошибкой функции
  • 1запросы при загрузке веб-сайтов очень медленные
  • 0Угловая функция запускается при нажатии, но не при инициализации в контроллере
  • 0Поймать показ полосы прокрутки
  • 0Освобождение памяти между циклами выполнения
  • 0Найти номер, ближайший к другому числу с ++
  • 1Повторите тест на AssertionError
  • 0Обновите родительскую область из директивы Child
  • 0Как установить значение readyStatement () для поля auto_increment в MySQL
  • 1список объектов для просмотра списка
  • 1Неоднозначный вызов Math.Round (int64 / int64, int)
  • 0NumberFormatException: для входной строки: «XXX, XX» в TextField, связанной с локалью
  • 1[Python Falcon]: gunicorn работает в терминале, но не в PyCharm
  • 1Получить средние строки, столбца матрицы из текстового файла
  • 1Получить все документы с помощью GridFSOperations
  • 1Заполнить перфорированную форму в изображении, используя библиотеки Python?
  • 0Как добавить функцию во все области видимости ..
  • 1Связь супервизора в шторме 0.9.0.1 с Netty
  • 1Вызываемый объект столбца в Dataframe Spark 2.2.1
  • 0Linux: код ошибки для Sendmail не найден
  • 0Laravel PHP: возникли проблемы при использовании nest ()
  • 1Stack Java фиксированного размера
  • 0Как отредактировать значение 3 метки после нажатия на HREF с Javascript?
  • 0отредактируйте htaccess, чтобы сделать его нечувствительным к регистру
  • 0Jquery не воспроизводит последовательность видео
  • 1На Vis.js, шкала времени, обновление отображения данных об изменениях
  • 1Нужно ли предоставлять методы получения / установки для полей Auditable в Spring Data?
  • 0Как использовать VBA для изменения «проверенного» свойства переключателей на веб-странице
  • 0Авто Требуется в PHP
  • 1Получить имена всех файлов в пути
  • 0fancybox 2 и названия

Сообщество Overcoder

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

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

Вопрос:

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

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 нет неявного преобразования типов (телеологически, потому что ошибки, которые он иногда производит, не считаются достойными сокращения синтаксиса).

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 creation failed at line 48
  • Ошибка value cannot be null parameter name value
  • Ошибка valorant directx runtime
  • Ошибка val 9 валоран
  • Ошибка val 51 валорант что делать