#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)"
}