如何将任何对象类型转换为字符串?
let single_result = results[i]
var result = ""
result = single_result.valueForKey("Level")
现在我收到错误:无法将任何对象的类型值赋给string类型的值。
如果我投了它:
result = single_result.valueForKey("Level") as! String
我收到错误: 无法转换类型' __ NSCFNumber' (0x103215cf0)到' NSString' (0x1036a68e0)。
我该如何解决这个问题?
答案 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"<",u"<").replace(u">",u">").replace(u"&",u"&").replace(u"><",u">\n<")
不需要其他任何东西。这适用于各种对象。