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

Преобразование или литье объекта в строку

как я могу преобразовать любой тип объекта в строку?

let single_result = results[i]
var result = ""
result = single_result.valueForKey("Level")

теперь я получаю ошибку: не удалось присвоить значение типа любому объекту значению строки типа.

и если я произведу его:

result = single_result.valueForKey("Level") as! String

я получаю ошибку: Не удалось передать значение типа "__NSCFNumber" (0x103215cf0) в "NSString" (0x1036a68e0).

Как я могу решить эту проблему?

4b9b3361

Ответ 1

Вы не можете использовать какое-либо случайное значение для строки. Приведение силы (as!) не будет выполнено, если объект не может быть перенесен в строку.

Если вы знаете, что он всегда будет содержать NSNumber, вам нужно добавить код, который преобразует NSNumber в строку. Этот код должен работать:

if let result_number = single_result.valueForKey("Level") as? NSNumber
{
  let result_string = "\(result_number)"
}

Если объект, возвращаемый для клавиши "Уровень", может быть разными типами объектов, тогда вам нужно будет написать более гибкий код для решения этих других возможных типов.

Быстрые массивы и словари обычно печатаются, что делает этот вид чище.

Я бы сказал, что ответ @AirSpeedVelocity (европейский или африканский?) является лучшим. Используйте встроенную функцию toString. Похоже, он работает на ЛЮБОЙ тип Swift.

EDIT:

В Swift 3 ответ, похоже, изменился. Теперь вы хотите использовать инициализатор строки

init(describing:)

Или, чтобы использовать код из вопроса:

result = single_result.valueForKey("Level")
let resultString = String(describing: result)

Обратите внимание, что обычно вы не хотите valueForKey. Это метод KVO, который будет работать только с NSObjects. Предполагая, что single_result является Словарем, вы, скорее всего, захотите использовать этот синтаксис:

result = single_result["Level"]

Ответ 2

Функция toString принимает любой тип и всегда создает строку.

Если это тип Swift, который реализует протокол Printable или переопределяет свойство описания NSObject s, вы получите все, что возвращает свойство .description. В случае NSNumber вы получите строковое представление числа.

Если он hasnt, вы получите довольно бесполезную строку имени класса плюс адрес памяти. Но большинство стандартных классов, включая NSNumber, создадут что-то разумное.

import Foundation

class X: NSObject {
    override var description: String {
        return "Blah"
    }
}

let x: AnyObject = X()
toString(x)  // return "Blah"
"\(x)"  // does the same thing but IMO is less clear

struct S: Printable {
    var description: String {
        return "asdf"
    }
}

// doesn't matter if it an Any or AnyObject
let s: Any = S()
toString(s) // reuturns "asdf"

let n = NSNumber(double: 123.45)
toString(n)    // returns "123.45"
n.stringValue  // also works, but is specific to NSNumber

(всегда используйте toString вместо тестирования Printable. С одной стороны, String не соответствует Printable...)

Ответ 3

toString() больше не существует в Swift 3.

Похоже, есть инициализатор с ошибкой, который вернет переданное значение description.

init?(_ description: String)

Документы здесь https://developer.apple.com/reference/swift/string/1540435-init