2014-10-15 6 views
1

«... вы почти никогда не должны использовать класс NSString непосредственно в свой собственный код»Swift Строки и NSString Инициализаторы

Выдержки От: Apple Inc. «Использование Swift с какао и Objective-C.» iBooks. https://itun.es/us/1u3-0.l

Несмотря на это смелое заявление, я думаю, что нашел ситуацию, когда мне нужен NSString. Например, рассмотрите этот кодовый блок:

NSString(
    contentsOfURL: NSURL(string: "http://api.stackexchange.com/answers?site=stackoverflow"), 
    encoding: NSUTF8StringEncoding, 
    error: &error) 

Я не могу сделать это с помощью строки Swift, правильно? В любом случае это не работает:

String(
    contentsOfURL: NSURL(string: "http://api.stackexchange.com/answers?site=stackoverflow"), 
    encoding: NSUTF8StringEncoding, 
    error: &error) //Compiler error 

Так что я должен использовать NSString здесь? Или есть еще один предпочтительный способ сделать это в Свифт?

+1

Чтобы быть справедливым, вы действительно не должны использовать 'NSString + contentsOfURL: ...', потому что он выполняет синхронный сетевой запрос. Вместо этого используйте 'NSURLSession dataTaskWithURL: completeHandler:'. – mattt

ответ

0

рамка Фонда расширяет Свифт-родную String типа имеет те же инициализаторы, как NSString, поэтому документация является правильно. (Спасибо, newacct.)

var error: NSError? 
let urlString: String? = String(
    contentsOfURL: NSURL(string: "http://api.stackexchange.com/answers?site=stackoverflow")!, 
    encoding: NSUTF8StringEncoding, 
    error: &error) 

Просто убедитесь, что смотреть ваши УСТРОЙСТВА - что инициализатор NSURL возвращает необязательная, который должен быть развернута, чтобы использовать в NSString инициализаторе, которая сама возвращает необязательный. Возможно, компилятор жаловался на это, как правило, тупой.

+3

Если 'Foundation' импортирован,' String' * имеет * инициализаторы * для 'contentOf ...' и 'format: arguments:' в Xcode 6.1. – newacct

+0

@newacct, спасибо - я не исследовал это недавно. –

1

Разница заключается в том, что с String NSURL не может быть нулевым, но отдача от NSURL(...) является необязательным - вам необходимо разворачивать его:

var error: NSError? = nil 
String(
    contentsOfURL: NSURL(string: "http://api.stackexchange.com/answers?site=stackoverflow")!, 
    // NB ! after NSURL(...) 
    encoding: NSUTF8StringEncoding, 
    error: &error) 

Или более явно (и правильно):

var error: NSError? = nil 
if let url = NSURL(string: "http://api.stackexchange.com/answers?site=stackoverflow") { 
    String(
     contentsOfURL: url, 
     encoding: NSUTF8StringEncoding, 
     error: &error) 
} 
+0

Я попытался вставить их обоих в игровое поле, но оба раза я получил ошибки компилятора. – PopKernel

+0

Работает для меня. Какая версия Xcode? – Grimxn

+1

Этот ответ верен для Xcode 6.1, но не Xcode 6.0 – newacct

Смежные вопросы