Поддерживает ли 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]()
Это просто и быстро? Я так не думаю.
Ответы
Ответ 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 в целое число