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

da1*_*bi3 16 swift

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

let single_result = results[i]
var result = ""
result = single_result.valueForKey("Level")
Run Code Online (Sandbox Code Playgroud)

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

如果我投了它:

result = single_result.valueForKey("Level") as! String
Run Code Online (Sandbox Code Playgroud)

我收到错误:无法将'__NSCFNumber'(0x103215cf0)类型的值转换为'NSString'(0x1036a68e0).

我该如何解决这个问题?

Dun*_*n C 29

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

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

if let result_number = single_result.valueForKey("Level") as? NSNumber
{
  let result_string = "\(result_number)"
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

编辑:

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

init(describing:)
Run Code Online (Sandbox Code Playgroud)

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

result = single_result.valueForKey("Level")
let resultString = String(describing: result)
Run Code Online (Sandbox Code Playgroud)

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

result = single_result["Level"]
Run Code Online (Sandbox Code Playgroud)


Sco*_*des 10

这是此处提供的 String 初始值设定项的文档。

let s = String(describing: <AnyObject>)

Run Code Online (Sandbox Code Playgroud)

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

  • 我收到错误“调用初始化程序时没有完全匹配” (2认同)

Air*_*ity 6

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

如果它是一个实现Printable协议的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
Run Code Online (Sandbox Code Playgroud)

(ps总是使用toString而不是测试Printable.一方面,String不符合Printable...)

  • 请注意,在Swift 3中删除了toString.使用`String(describe:)`代替 (4认同)

Ram*_*sel 5

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

看起来有一个失败的初始化程序将返回传入值的description.

init?(_ description: String)

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