2016-08-17 2 views
1

Почему эту работу (пример 1):Дополнительная цепочка в один шаг?

if let numString:String = Model.selectedLocation?.zip{ 
     let callString:String = String(format:"tel:%@",numString) 
     //more code here 
    } 

Но не это (пример 2):

if let numString:String = String(format:"tel:%@",Model.selectedLocation?.zip){ 
     //more code here 
    } 

Во втором примере, Xcode выдает ошибку и хочет zip быть развернута как: String(format:"tel:%@",(Model.selectedLocation?.zip)!)
, но если я сделаю это, приложение выйдет из строя, когда zip - это нуль.

ВОПРОС: Есть ли способ сделать второй пример выше работы или это невозможно/правильно?

+0

Не используйте 'String (format:)' в этом случае. См. Мой ответ. – Alexander

ответ

1

Строго говоря, пример 2 не является необязательным связыванием и необязательной цепью, потому что String(format...) возвращает необязательный параметр String, а параметр format также должен быть необязательным.

Пример 1 - правильный и рекомендуемый синтаксис для обработки опций.

Edit: Я полностью согласен с ответом Александра (за исключением того, что String(format:) возвращается String?)

+0

Я думаю, что ваш комментарий правильный, и нет возможности сделать все это в одной строке, как я надеялся. Благодаря! – rmp

0

ОБНОВЛЕНО

Это происходит потому, что в String (формат: "",), то аргументы должны быть не -не, следовательно, !.

при использовании, если пусть проверить дополнительные опции, операторы должны вернуть УСТРОЙСТВА

// Assuming Model.selectionLocation.zip is of String type 
if let numberString = Model.selectedLocation?.zip { 

    let formattedString = String(format:"tel:%@", numberString) 

} 

или использовать сторожевые

guard let numberString = Model.selectedLocation?.zip else { 
     return 
    } 
    let numberString = String(format:"tel:%@", numberString) 
+0

1-) не компилируется, потому что String (format ...) возвращает необязательный. – vadian

+0

вы проверили его, @vadian? Ответ правильный –

+1

@ Александр Ткаченко Да, сообщение об ошибке есть * инициализатор для условной привязки должен иметь необязательный тип, а не 'String' * – vadian

3
  1. Избегайте избыточный тип аннотации
  2. Избегайте String(format:) если вам не требуется Это. Это метод NSString из Foundation структуры, которая имеет несколько последствий:
    1. Это требует Foundation быть импортированы.
    2. Он неявно соединяет ваши String с номером NSString.
    3. Это не сработает в Swift 3, потому что мост был сделан явным.

Корневая проблема здесь в том, что String(format:) возвращает String? (так как строка формата может быть недействительным). Вы можете избежать этого полностью, используя интерполяцию строк Swift:

if let numString = Model.selectedLocation?.zip { 
    let callString = "tel: \(numString)" 
    //more code here 
} 

...или простое соединение:

if let numString = Model.selectedLocation?.zip { 
    let callString = "tel: " + numString 
    //more code here 
} 
+0

Спасибо, это тоже полезная информация! – rmp

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