2016-01-01 3 views
1

Я знаю, что если я хочу использовать переменную текст вне этого Ьгу блока в Swift, я хотел бы написать этот код константы выглядит,Есть ли способ использовать неизменяемый внешний блок 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. Есть ли способ, чтобы текст рассматривался как константа вне блока try в этом контексте Swift? Или это просто тоска старого человека, кодирующего в старом стиле, и я должен использовать var, забыть об этом и двигаться дальше?

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

+1

Объявите его как 'let text: NSString' перед блоком try. Вы все равно можете назначить ему, пока вы это делаете только один раз. –

ответ

6

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

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

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

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

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

+0

Быстрый родной тип String not NSString –

+0

Согласен. Я использовал код из вопроса, чтобы проиллюстрировать синтаксис объявления, и предположил, что у Dribbler есть причина для использования NSString, поэтому он оставил его таким образом. – jbg

+0

Не похоже, что в этом случае просто упоминается, что он всегда должен использовать String, если только это не необходимо –

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