Я знаю, что если бы я хотел использовать переменную text вне этого блока try в Swift, я бы написал этот код следующим образом,

var text = NSString()

do {
    text = try NSString( contentsOfURL: url, encoding: NSUTF8StringEncoding ) }
catch let errOpening as NSError {
// ...
}

С давних времен, когда хранение данных осуществлялось по байтам, моей мантрой было использование констант, если это вообще возможно. Поэтому в случае, когда текст будет загружен один раз и никогда не изменится, моя интуиция подсказывает мне сделать его константой.

do {
    let text = try NSString( contentsOfURL: url, encoding: NSUTF8StringEncoding ) }
catch let errOpening as NSError {
// ...
}

Но тогда я не могу использовать загруженный текст вне блока try. Есть ли способ заставить Swift рассматривать текст как константу вне блока try в этом контексте? Или это просто тоска старика, кодирующего в старом стиле, и мне следует использовать var, забыть об этом и двигаться дальше?

Заранее большое спасибо!

Dribbler

Ответов: 1

Ответы (1)

Вы можете сделать:

let text: String
do {
    text = try String(contentsOfURL: url, encoding: NSUTF8StringEncoding)
}
catch let error as NSError {
    // ...
}

(Я использовал String, родной строковый тип в Swift, а не NSString.)

Если последующий код использует text, блок catch должен либо присвоить ему что-то, либо вернуться из вложенной функции, так как константы должны быть инициализированы перед использованием.

Не забывайте, что метод, который вы используете для получения содержимого URL в виде строки, работает синхронно, поэтому если этот код будет выполняться в главном потоке, вы заблокируете пользовательский интерфейс. Посмотрите в документации NSURLSession подробности об асинхронной загрузке содержимого URL, что позволит избежать блокировки пользовательского интерфейса.

2022 WebDevInsider