2015-05-14 88 views
2

现在,苹果已轻松摆脱NSStringString自动兼容性,我有一点噩梦在两者之间。我得到几个NSString出去了一本字典的,我无法将它们转换为普通String小号...Swift 1.2 Xcode 6.3 NSString?给字符串给线程1:EXC_BAD_ACCESS(代码= 1,地址= 0x20)

我已经试过:

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

但所有产生错误。

我在转换点打破了,可以看到无论是NSString的零:

但随着要么没有喜悦。获取Thread 1: EXC_BAD_ACCESS (code=1, address=0x20)。我在这里错过了很明显的东西吗

即使只是试图打印​​转换导致相同的错误面前..

之前发布的代码转换的尝试,看看是否有什么关系呢?

// 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] 
} 

+0

将NSString转换为字符串不需要再强制下载,因此只能使用'filename作为字符串'。关于你的问题文件名是什么类型? –

+0

什么是文件名? – user3182143

+0

@zellb Xcode告诉我它需要它,因为它是'NSString?'。 –

回答

2

如果这是一个NSString,第所有你需要做的是filename as String(no !)。但这听起来像问题是您的filename,可选类型NSString?,是nil。 (选项单击filename,以确认它的类型)

如果有一个合理的默认值(比方说,一个空字符串),尝试

let fileNameString = (filename as? String) ?? "" 

或者,如果你需要处理nil特定代码:

if let fileNameString = filename as? String { 
    // use fileNameString, which will be unwrapped and of type String 
} 
else { 
    // log error or similar 
} 

或者,如果你想推迟展开,但要更改可能值里面的类型,你可以做

let fileNameString = filename as? String 
// which is a less long-winded way of saying 
let fileNameString = filename.map { $0 as String } 

一般来说,您应该尝试减少!的用法,因为它会导致类似的问题。 !仅适用于从代码中知道值绝对肯定不能为nil的那些时间。

编辑:基于您的示例代码,请尝试以下操作:这里

let url = NSURL(string: "http://www.google.com") 
let request = url.map { NSMutableURLRequest(URL: $0) } 
request?.HTTPMethod = "HEAD" 

let response: NSHTTPURLResponse? = request.flatMap { 
    var response: NSURLResponse? 
    NSURLConnection.sendSynchronousRequest($0, returningResponse: &response, error: nil) 
    return response as? NSHTTPURLResponse 
} 

let headers = response?.allHeaderFields as? [String:String] 

// google.com has no such header but still... 
let filename = headers?["sfn-Document-Filename"] 

// bear in mind someArray[1] will also crash if there's no such entry, 
// first/last are better if that's what you want 
let type = headers?["Content-Type"]? 
       .componentsSeparatedByString(";").first? 
       .componentsSeparatedByString("/").last 

一切都是可选的,但安全的,所以你可以在不同的点测试零的记录/错误报告的目的。

+0

请看我的编辑 –

+0

嗯,奇怪。唯一奇怪的是它显示'(NSString?)'而不是'NSString'。无论如何,尝试上述技术之一,它可能是一个编译器怪癖,这些将作为一种解决方法。如果这不起作用,也许尝试'filename.0 ?? “” - 我有时会看到奇怪的1-tuple编译器bug出现,有时候会影响它们。 –

+0

我已经尝试过'filename?字符串“,但由于它是一个'NSString?'它告诉我它需要'!'。仍然得到'Thread 1:EXC_BAD_ACCESS(code = 1,address = 0x20)' –

相关问题