Подтвердить что ты не робот

Поддерживает ли Swift неявное преобразование?

Например, у меня есть следующий код:

    let numberOfBlocks = 3
    let blockWidth = SKSpriteNode(imageNamed: "image.png").size.width
    let padding = 20.0

    let offsetX : Float = (self.frame.size.width - (blockWidth * numberOfBlocks + padding * (numberOfBlocks-1))) / 2

Я получил ошибку:

'Double' не конвертируется в 'UInt8'

Есть ли способ неявно преобразовывать тип данных (возможно, только для примитивного типа данных)?

Изменить:

Я знаю, как сделать явное преобразование, используя конструктор определенного типа, как Iducool. Но это не очень помогает моему вопросу, потому что мы даже не знаем, где добавить конверсии. Я упростил свое выражение на детской площадке:

enter image description here

Проблема заключается в переменной "padding", сообщение об ошибке

'Double' не конвертируется в 'UInt8'.

Итак, я сделал преобразование:

enter image description here

Тогда проблема теперь в переменной "blockWidth".

Я снова добавил преобразование:

enter image description here

И сообщение об ошибке:

Тип 'UInt8' не соответствует протоколу 'FloatLiteralCovertible'

Конечное рабочее выражение:

enter image description here

Это просто и быстро? Я так не думаю.

4b9b3361

Ответ 1

В Swift неявно выполняется листинг.

Простое преобразование в swift использует конструктор определенного типа.

Как будто вы хотите получить Float из double, вы можете использовать Float(doubleValue) и Same way, если вы хотите преобразовать float в integer, тогда вы можете использовать Int(floatValue).

В вашем случае:

let intValue = UInt8(doubleValue)

Остерегайтесь того, что после десятичной точки вы потеряете любое значение. Итак, выберите лучший способ. Выше конверсия - это просто помочь вам понять.

Обратите внимание, что Swift всегда выбирает Double (а не Float) при выводе типа чисел с плавающей запятой.

Ответ 2

Swift не поддерживает неявное использование в Xcode6 GM. Следующий ответ применим только к бета-версии Xcode6.


Я не хочу говорить о том, что неявное приведение является хорошим или плохим, но вы можете получить его, если действительно хотите с __conversion()

например. Если вам нужно UInt8 и Int иметь возможность конвертировать из Double

extension Double {
    func __conversion() -> UInt8 { return UInt8(self) }
    func __conversion() -> Int { return Int(self) }
    // add more if you need to
}

xcrun swift
Welcome to Swift!  Type :help for assistance.
  1> extension Double {
  2.     func __conversion() -> UInt8 { return UInt8(self) }
  3. }
  4> var d = 1.0
d: Double = 1
  5> var u8 : UInt8 = d
u8: UInt8 = 1
  6>

Примечание. Я не буду помещать это в свой производственный код. Я хочу указать, если это возможно, но не рекомендую.

Ответ 3

с помощью метода bridgeToObjectiveC() вы можете вызвать методы, предоставленные в Objective-C, для преобразования из одного примитивного типа данных в другой, например,

variable_name.bridgeToObjectiveC().intValue

преобразует эту переменную с именем variable_name в целое число