Метки аргументов '(stringInterpolationSegment :)' не соответствуют ни одной доступной перегрузке

После обновления последней версии Xcode версии 10.2 (10E125) я получаю эту ошибку:

Ярлыки аргументов '(stringInterpolationSegment :)' не соответствуют ни одной доступной перегрузке

Не удалось найти решение, пожалуйста, есть идеи?

let interpolation1 = String(stringInterpolationSegment:self.addSpotAnnotation!.coordinate.latitude)
let interpolation2 = String(stringInterpolationSegment:self.addSpotAnnotation!.coordinate.longitude)
let coordinate:String = interpolation1 + "," + interpolation2

person Arafin Russell    schedule 27.03.2019    source источник
comment
Можете ли вы указать строку кода или строки, в которых возникает эта ошибка?   -  person Mike Taverne    schedule 27.03.2019
comment
Это уже существующее приложение, и есть много мест, где его использовали. Один из них такой: let coordinate:String = String(stringInterpolationSegment: self.addSpotAnnotation!.coordinate.latitude) + "," + String(stringInterpolationSegment: self.addSpotAnnotation!.coordinate.longitude)   -  person Arafin Russell    schedule 27.03.2019
comment
Замените stringInterpolationSegment на stringInterpolation.   -  person Sachin Vas    schedule 27.03.2019


Ответы (2)


Ошибка связана с изменениями. как работает строковая интерполяция в Swift 5.

Решением является не заменять String(stringInterpolationSegment:) на String(stringInterpolation:):

Мы не предлагаем сохранять существующие инициализаторы init (stringInterpolation :) или init (stringInterpolationSegment :), поскольку они всегда были задокументированы как вызовы, которые не следует использовать напрямую. [курсив мой]

Пример, который вы привели:

coordinate:String = 
      String(stringInterpolationSegment: self.addSpotAnnotation!.coordinate.latitude) 
    + "," 
    + String(stringInterpolationSegment: self.addSpotAnnotation!.coordinate.longitude)

гораздо проще записать как:

let coordinate = "\(self.addSpotAnnotation!.coordinate.latitude),\(self.addSpotAnnotation!.coordinate.longitude)"
person Mike Taverne    schedule 27.03.2019

Обновления строковой интерполяции

Swift 4.2 реализует строковую интерполяцию путем интерполяции сегментов:

let language = "Swift"
let languageSegment = String(stringInterpolationSegment: language)
let space = " "
let spaceSegment = String(stringInterpolationSegment: space)
let version = 4.2
let versionSegment = String(stringInterpolationSegment: version)
let string = String(stringInterpolation: languageSegment, spaceSegment, versionSegment)

В этом коде компилятор сначала оборачивает каждый литеральный сегмент, а затем интерполирует его с помощью init (stringInterpolationSegment :). Затем он объединяет все сегменты вместе с init (stringInterpolation :)

Swift 5 использует совершенно другой подход

// 1
var interpolation = DefaultStringInterpolation(
literalCapacity: 7,
interpolationCount: 1)
// 2
let language = "Swift"
interpolation.appendLiteral(language)
let space = " "
interpolation.appendLiteral(space)
let version = 5
interpolation.appendInterpolation(version)
// 3
let string = String(stringInterpolation: interpolation)

Вот что делает этот код:

Определите экземпляр DefaultStringInterpolation с определенной емкостью и счетчиком интерполяции. Вызовите appendLiteral (:) или appendInterpolation ( :), чтобы добавить литералы и интерполированные значения в интерполяцию. Создайте окончательную интерполированную строку, вызвав init (stringInterpolation :)

кредит: raywenderlich

person Arafin Russell    schedule 27.03.2019