Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 将对象转换或强制转换为字符串_Swift - Fatal编程技术网

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>)