2015-09-29 5 views
1

Как преобразовать строку в CGFloat?Преобразование строки в CGFloat

Я пробовал:

var string  = "132" 
var stringChange  = CGFloat((string as NSString).floatValue) 

Но в Xcode 7 не работает.

+0

Ваш код работает нормально с Xcode 7 здесь –

+1

Кто проголосовал? Этот поток нужен, потому что, откровенно говоря, глупо, вы не можете просто «CGFloat (string)» –

ответ

4

Как это:

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.

+0

CGFloat - это поплавок на 32-битных системах и двойной в 64-битных системах. Создавая двойное и превращая это в CGFloat, вы выполняете работу CGFloat и неправильно. – Abizern

+0

@ Абизерн, какова работа CGFloat? В случае, если CGFloat имеет 64 бита, этот метод будет работать нормально. Если CGFloat - 32 бита, этот метод будет использовать несколько лишних бит памяти, что тоже прекрасно. Вы можете уточнить? –

-1

Тип 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 
+0

Это не совсем так: тип '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

0

Попробуйте этот код:

var yourString  = "132.0" 
var yourFloatvalueFromString = CGFloat(NumberFormatter().number(from: yourString)!) 
Смежные вопросы