【发布时间】:2015-05-14 10:22:27
【问题描述】:
现在苹果已经轻松地摆脱了NSString 和String 的自动兼容性,我在两者之间有点噩梦。我从字典中得到了几个NSStrings,但我无法将它们转换为常规的Strings...
我试过了:
let fileNameString: String = String(format: "%@", filename!)
let fileNameString: String = (filename as! String)
let fileNameString = filename as? String
let fileNameString = (filename as? String) ?? ""
if let fileNameString = filename as? String {
println("\(fileNameString)")
}
但都产生错误。
我已经在转换点插入并且看不到 NSStrings 都不是 nil:
但两者都不高兴。获取Thread 1: EXC_BAD_ACCESS (code=1, address=0x20)。我在这里遗漏了什么明显的东西吗?
即使只是在转换前尝试打印 NSString filename 也会导致相同的错误..
在转换之前发布代码尝试查看是否与它有关...
// First we create a head request as the info I need is in the headers
var newRequest: NSMutableURLRequest = NSMutableURLRequest(URL: request.URL!)
newRequest.HTTPMethod = "HEAD"
var response: NSURLResponse?
NSURLConnection.sendSynchronousRequest(newRequest, returningResponse: &response, error: nil)
// Unwrap response as httpResponse in order to access allHeaderFields
if let httpResponse = response as? NSHTTPURLResponse {
let headerString = "sfn-Document-Filename"
let headerNSString = headerString as NSString
let filetypeString = "Content-Type"
let filetypeNSString = filetypeString as NSString
// This is a dictionary where the keys are NSCFStrings
// (NSStrings, hence creating the NSStrings above)
var allHeaders = httpResponse.allHeaderFields
// Getting the filename out here only works with as? NSString. as? String creates the same error as converting.
let filename = allHeaders[headerNSString] as? NSString
// This is a string which contains the type as 'application/pdf' for example. We only need the part after the /.
// Again, trying to get this out as a String fails
let typeString = allHeaders[filetypeNSString] as? NSString
var typeArray = typeString?.componentsSeparatedByString("/") as! [NSString]
let filetype = typeArray[1]
}
【问题讨论】:
-
将 NSString 转换为 String 不再需要强制向下转换,因此您只能使用
filename as String。关于你的问题 filename 有什么类型? -
这里的文件名是什么?
-
@zellb Xcode 告诉我它需要它,因为它是
NSString?。 -
@user3182143 请看我的编辑
-
在尝试解包之前,您确定文件名不是 nil 吗?您可以尝试使用
if let myNSString = filename{ let fileNameString: String = (filename as! String) }选择性地打开它并检查是否满足条件吗?