将对象转换或转换为字符串

时间:2015-05-16 19:41:12

标签: swift

如何将任何对象类型转换为字符串?

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

现在我收到错误:无法将任何对象的类型值赋给string类型的值。

如果我投了它:

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

我收到错误: 无法转换类型' __ NSCFNumber' (0x103215cf0)到' NSString' (0x1036a68e0)。

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:26)

您不能将任何随机值转换为字符串。如果无法将对象强制转换为字符串,则强制转换(as!)将失败。

如果您知道它将始终包含NSNumber,那么您需要添加将NSNumber转换为字符串的代码。这段代码应该有效:

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

如果为“Level”键返回的对象可以是不同的对象类型,那么您需要编写更灵活的代码来处理其他可能的类型。

Swift数组和字典通常是打字的,这使得这种东西更清晰。

我会说@ AirSpeedVelocity的答案(欧洲或非洲?)是最好的。使用内置的toString功能。听起来它适用于任何Swift类型。

编辑:

在Swift 3中,答案似乎已经改变。现在,您想要使用String初始化程序

init(describing:)

或者,使用问题中的代码:

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

请注意,通常您不需要valueForKey。这是一个只适用于NSObjects的KVO方法。假设single_result是一个Dictionary,您可能需要这种语法:

result = single_result["Level"]

答案 1 :(得分:6)

toString函数接受任何类型,并且始终生成一个字符串。

如果它是实现Printable协议的Swift类型,或者已覆盖NSObject的描述属性,那么您将获得.description属性返回的任何内容。在NSNumber的情况下,您将获得该数字的字符串表示。

如果没有,你会得到一个相当无用的类名字符串和内存地址。但是大多数标准类,包括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's 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

(p.s。始终使用toString而非测试Printable。首先,String不符合Printable ...)

答案 2 :(得分:1)

toString()似乎不再存在于Swift 3中。

看起来有一个可用的初始化程序会返回传入的值description

init?(_ description: String)

此处的文档https://developer.apple.com/reference/swift/string/1540435-init

答案 3 :(得分:0)

This is the documentation for the String initializer provided here.

tempxml = ET.tostring(cdadoc, encoding='unicode_internal', method='xml')
test = ET.tostring(cdadoc, encoding='punycode', method='xml')
print(type(tempxml))
print(type(test))
tempxml = tempxml.replace(u"&lt;",u"<").replace(u"&gt;",u">").replace(u"&amp;",u"&").replace(u"><",u">\n<")

不需要其他任何东西。这适用于各种对象。