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

Преобразование String в CGFloat в Swift

Я новичок в Swift, как я могу преобразовать String в CGFloat?

Я пробовал:

var fl: CGFloat = str as CGFloat
var fl: CGFloat = (CGFloat)str
var fl: CGFloat = CGFloat(str)

все не работает

4b9b3361

Ответ 1

Если вы хотите безопасный способ сделать это, вот возможность:

let str = "32.4"
if let n = NSNumberFormatter().numberFromString(str) {
    let f = CGFloat(n)
}

Если вы измените str на "bob", он не будет преобразован в float, тогда как большинство других ответов будет преобразовано в 0.0.

Для Swift 3.0 я бы сделал что-то вроде этого:

let str = "32.4"
guard let n = NSNumberFormatter().number(from: str) else { return }
// Use `n` here

В Swift 4, NSNumberFormatter был переименован в NumberFormatter:

let str = "32.4"
guard let n = NumberFormatter().number(from: str) else { return }

Ответ 2

С Swift 2.0 тип Double имеет инициализатор с ошибкой, который принимает String. Таким образом, самый безопасный способ перехода от String до CGFloat:

let string = "1.23456"
var cgFloat: CGFloat?

if let doubleValue = Double(string) {
    cgFloat = CGFloat(doubleValue)
}

// cgFloat will be nil if string cannot be converted

Если вам нужно делать это часто, вы можете добавить метод расширения к String:

extension String {

  func CGFloatValue() -> CGFloat? {
    guard let doubleValue = Double(self) else {
      return nil
    }

    return CGFloat(doubleValue)
  }
}

Обратите внимание, что вы должны вернуть CGFloat?, поскольку операция может завершиться неудачей.

Ответ 3

Это работает:

let str = "3.141592654"
let fl = CGFloat((str as NSString).floatValue)

Ответ 4

Вам следует отбрасывать string в double, а затем отбрасывать от double до CGFloat. Попробуйте это:

let fl: CGFloat = CGFloat((str as NSString).doubleValue)

Ответ 5

в Swift 3.0

if let n = NumberFormatter().number(from: string) {
  let f = CGFloat(n)
}

или это, если вы уверены, что строка соответствует всем требованиям

let n = CGFloat(NumberFormatter().number(from: string)!)

Ответ 6

В то время как другие ответы верны, но результат, который вы видите, будет иметь концевые десятичные числа.

Например:

let str = "3.141592654"
let foo = CGFloat((str as NSString).floatValue)

Результат:

3.14159274101257

Чтобы получить правильное значение из строки, попробуйте следующее:

let str : String = "3.141592654"
let secStr : NSString = str as NSString
let flt : CGFloat = CGFloat(secStr.doubleValue)

Результат:

3.141592654

Ответ 7

Вы можете сделать расширение, которое добавляет инициализацию в CGFloat

extension CGFloat {

    init?(string: String) {

        guard let number = NumberFormatter().number(from: string) else {
            return nil
        }

        self.init(number.floatValue)
    }

}

Используйте это так let x = CGFloat(xString)

Ответ 8

в Swift 3.1

if let n = NumberFormatter().number(from: string) {
   let fl = CGFloat(n)
} 

или

let fl = CGFloat((str as NSString).floatValue))

Ответ 9

Это своего рода работа, но вы можете использовать ее как NSString, затем получить значение float, а затем инициализировать CGFloat из этого значения. Пример:

let str = "1.02345332"
let foo = CGFloat((str as NSString).floatValue)

Ответ 10

Хороший вопрос. На самом деле нет чистого Swift API для преобразования строки, которая представляет CGFloat в CGFloat. Единственное число, представленное строкой, которое Swift позволяет преобразовать в число, является целым числом. Вам нужно будет использовать какой-то другой подход из какой-либо другой библиотеки - например, начните с Foundation NSString или C (Darwin's) strtod.

Ответ 11

Простое решение в одну строку:

let pi = CGFloat(Double("3.14") ?? 0)