2016-09-19 3 views
8

С Swift 3.0 У меня есть проблемы со струнами, особенно с конкатенацией. Первый пример будет тем, что я использовал с тех пор, как начал использовать Swift для определения строк url.Swift 3.0 String concatenation leaves «Необязательно»

internal let host: String! = "https://host.io/" 
let urlString = "\(host)oauth/access_token" 

где хост определяется как в начале класса. Это отлично работало до Swift 3.0, теперь это выглядит так:

Optional("https://host.io/")oauth/access_token 

Это очень странно. Теперь я должен написать это

let urlString = host + "oauth/access_token" 

Чтобы получить ожидаемый результат.

https://host.io/oauth/access_token 

Другое - Я думаю, что подобная проблема, с которой я столкнулась со Струнами, - это. Я снова конкатенирую строки, но на этот раз я использую + ilke с urlString, но на этот раз это не сработает. Строка кода выглядит так:

self.labelName.text = currentUser.name + " " + String(describing: ageComponents.year) 

который, к сожалению, создает строку следующим образом: «Мое имя Необязательно (26)». В этом случае у меня нет решения String(describing: ageComponents.year) не является дополнительным, и он не позволяет мне делать такие вещи, как String(describing: ageComponents.year) ?? "whatever"

Кто-нибудь видел что-то подобное?

+4

См. [Swift 3 неверная строка интерполяции с неявно развернутыми строками] (http://stackoverflow.com/questions/39537177/swift-3-incorrect-string-interpolation-with-implicitly-unwrapped-strings) - если Swift может тип проверяет неявно разворачиваемую опцию как сильную опцию, она будет отстаивать это, заставляя ее разворачивать ее. В вашем втором примере «ageComponents.year» (неявно развернутый) необязательный? – Hamish

+0

Я действительно пытаюсь увидеть хорошее во всех этих изменениях Swift 3.0, но это происходит очень медленно и тяжело. Во втором примере. Год не был развернут. Это решает второй пример. Может быть, вы должны написать это как ответ. – jovanjovanovic

+1

Я не могу повернуть голову вокруг этого предложения SE-0054. Пример говорит, что если мы сделаем что-то вроде: let x: Int! = 5 let y = x let z = x + 0; 'y' будет 'Int?' - необязательный. Точно, «z» не будет, потому что он не может быть создан как необязательный из-за знака «+». То, что я не могу получить, это то, что я становлюсь Int? хорошо? Почему что-то создавалось из неявно развернутого «Int!»? стать «Int?»? Я понимаю '!' как - я уже говорил вам, что это не факультативно, поэтому используйте его так. – jovanjovanovic

ответ

2

В Swift 3 все свойства DateComponents являются опционными, в отличие от Фонда NSDateComponents.

var year: Int? { get set } 

Необходимо его развернуть. Если вы указали устройство year в ageComponents, вы можете сделать это безопасно.

+1

Да, это немного назад. Вы должны указать единицы, которые хотите, но они по-прежнему выходят как дополнительные. –