Как преобразовать строку в CGFloat?Преобразование строки в CGFloat
Я пробовал:
var string = "132"
var stringChange = CGFloat((string as NSString).floatValue)
Но в Xcode 7 не работает.
Как преобразовать строку в CGFloat?Преобразование строки в CGFloat
Я пробовал:
var string = "132"
var stringChange = CGFloat((string as NSString).floatValue)
Но в Xcode 7 не работает.
Как это:
let cgFloat : CGFloat? = Double("1.49").map{ CGFloat($0) }
cgFloat
является nil
, если строка не может быть разобран
Вы также можете использовать версию без map
, который делает точно то же самое:
let cgFloat : CGFloat?
if let double = Double("1.49") {
cgFloat = CGFloat(double)
} else {
cgFloat = nil
}
Пример:
let toCGFloat = { Double($0).map{ CGFloat($0) } }
toCGFloat("123") // 123
toCGFloat("123.3") // 123.3
toCGFloat("123.8326947239875") // 123.8326947239875
Вы можете изменить Double
на Float
и посмотреть, как значения становятся неточными, вот почему вы должны использовать Double
.
CGFloat - это поплавок на 32-битных системах и двойной в 64-битных системах. Создавая двойное и превращая это в CGFloat, вы выполняете работу CGFloat и неправильно. – Abizern
@ Абизерн, какова работа CGFloat? В случае, если CGFloat имеет 64 бита, этот метод будет работать нормально. Если CGFloat - 32 бита, этот метод будет использовать несколько лишних бит памяти, что тоже прекрасно. Вы можете уточнить? –
Тип CGFloat - это тип, зависящий от того, выполняется ли система, 32-разрядная или 64-разрядная. По существу - это поплавок.
Поверните строку в поплавок, а затем превратите ее в CGFloat. Однако при создании подобных преобразований вам необходимо знать, что не все строки могут быть превращены в float (и, следовательно, в CGFloat). Таким образом, хорошее решение было бы написать простой Инициализатор для CGFloat из строки, как например:
extension CGFloat {
init?(_ str: String) {
guard let float = Float(str) else { return nil }
self = CGFloat(float)
}
}
И это расширение может быть использовано следующим образом:
let f1 = CGFloat("123") // => 123
let f2 = CGFloat("123.3") // => 123.300003051758
let f3 = CGFloat("123a") // => nil
Это не совсем так: тип 'Float' определяется как typealias' Float32' на 32 _and_ 64-битных системах. Таким образом, в вашем коде число, в котором указано 15 цифр (64 бит), будет усечено до 7 цифр (32 бит), хотя CGFloat сможет хранить все 64 бита. Вот почему я использовал Double (typealias of Float64) в своем коде: в 64-битной системе Double = CGFloat, без проблем; в 32-битной системе мы предоставляем CGFloat с 64-битным значением, которое затем усекается, потому что CGFloat = Float32 может только рассказ 32 бит – Kametrixom
Попробуйте этот код:
var yourString = "132.0"
var yourFloatvalueFromString = CGFloat(NumberFormatter().number(from: yourString)!)
Ваш код работает нормально с Xcode 7 здесь –
Кто проголосовал? Этот поток нужен, потому что, откровенно говоря, глупо, вы не можете просто «CGFloat (string)» –