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

#swift #xcode10.2

#swift #xcode10.2

Вопрос:

После обновления последней версии 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
  

Комментарии:

1. Можете ли вы указать строку кода или строки, в которых возникает эта ошибка?

2. Это существующее приложение, и есть много мест, где оно использовалось. Одна из них выглядит следующим образом: let coordinate:String = String(stringInterpolationSegment: self.addSpotAnnotation!.coordinate.latitude) "," String(stringInterpolationSegment: self.addSpotAnnotation!.coordinate.longitude)

3. Замените stringInterpolationSegment на stringInterpolation .

Ответ №1:

Ошибка вызвана изменениями в том, как работает интерполяция строк в 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)"
  

Ответ №2:

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

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

Ответ №3:

 public func == <T>(lhs: ResultTest<T>, rhs: ResultTest<T>) -> Bool {
    return  "(lhs)" == "(rhs)"
}