Swift 将对象转换或强制转换为字符串
如何将任何对象类型转换为字符串Swift 将对象转换或强制转换为字符串,swift,Swift,如何将任何对象类型转换为字符串 let single_result = results[i] var result = "" result = single_result.valueForKey("Level") 现在我得到了错误:无法将任何对象类型的值分配给字符串类型的值 如果我投下它: result = single_result.valueForKey("Level") as! String 我得到一个错误: 无法将类型为“\uu NSCFNumber”(0x103215cf0)的值强
let single_result = results[i]
var result = ""
result = single_result.valueForKey("Level")
现在我得到了错误:无法将任何对象类型的值分配给字符串类型的值
如果我投下它:
result = single_result.valueForKey("Level") as! String
我得到一个错误:
无法将类型为“\uu NSCFNumber”(0x103215cf0)的值强制转换为“NSString”(0x1036a68e0)
如何解决此问题?您不能对字符串强制转换任何随机值。如果无法将对象强制转换为字符串,强制转换(
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中,答案似乎已经改变。现在,您想使用字符串初始值设定项
init(describing:)
或者,使用问题中的代码:
result = single_result.valueForKey("Level")
let resultString = String(describing: result)
请注意,通常您不需要valueForKey。这是一个KVO方法,它只适用于NSO对象。假设single_result是一个字典,您可能希望使用以下语法:
result = single_result["Level"]
toString
函数接受任何类型,并始终生成字符串
如果它是实现可打印
协议的Swift类型,或已重写NSObject
的description属性,则您将获得.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
(请务必使用toString
而不是测试Printable
。首先,String
不符合Printable
。)toString()
似乎不再存在于Swift 3中
看起来有一个可失败的初始值设定项将返回传入值的说明
init?(\udescription:String)
此处的文档
设s=String(描述:)
没有其他需要。这适用于各种对象 什么类型的
single\u result.valueForKey(“Level”)
您是否尝试过使用String(single\u result.valueForKey(“Level”))
什么是类型的结果?或者您可以使用result\u number.stringvalue您可以直接在值上使用toString
,而不强制转换它。字符串插值只是调用toString
?我不知道toString在所有Swift类中都实现过。谢谢你。(投票)注意,在Swift 3中删除了toString。使用String(description:)
instead这看起来像是一个有用答案的开始,但由于缺乏足够的解释,它最终进入了审阅队列。请编辑答案以添加更多信息。这足够长吗?我收到错误“呼叫初始值设定者时没有精确匹配”@Curtis,很抱歉响应太晚,你知道了吗?你传递给初始值设定者的对象是什么?
let s = String(describing: <AnyObject>)