Почему String.subscript (_ :) требует, чтобы типы `String.Index` и` Int` были равны, когда не включено `Int`? - PullRequest
2 голосов
/ 06 февраля 2020

Я не понимаю проблемы, с которой Xcode сталкивается в этой строке:

iteration.template = template[iterationSubstring.endIndex...substring.startIndex]

template является String, а iterationSubstring и substring являются Substring с template. Xcode выделяет открывающую квадратную скобку следующим сообщением:

Подстрочный индекс 'subscript (_ :)' требует, чтобы типы 'Substring.Index' и 'Int' были эквивалентны

Сообщение об ошибке не имеет никакого смысла для меня. Я пытаюсь получить Substring, создав Range<String.Index> с индексом [template.startIndex...template.endIndex]. Как это связано с Int? И почему этот шаблон работает в другом месте?


Код игровой площадки Xcode, воспроизводящий проблему:

import Foundation
let template = "This is an ordinary string literal."

let firstSubstringStart = template.index(template.startIndex, offsetBy: 5)
let firstSubstringEnd = template.index(template.startIndex, offsetBy: 7)
let firstSubstring = template[firstSubstringStart...firstSubstringEnd]

let secondSubstringStart = template.index(template.startIndex, offsetBy: 10)
let secondSubstringEnd = template.index(template.startIndex, offsetBy: 12)
let secondSubstring = template[secondSubstringStart...secondSubstringEnd]

let part: String = template[firstSubstring.endIndex...secondSubstring.startIndex]

В конце концов у меня есть строка шаблона и две ее подстроки. Я хочу получить String в диапазоне от конца первого Substring до начала второго Substring.

1 Ответ

4 голосов
/ 06 февраля 2020

Текущая версия Swift работает со структурой Substring, которая является нарезанной String.

Ошибка кажется вводящей в заблуждение и возникает, если вы собираетесь назначить (диапазон подписан) Substring в String переменную.

Чтобы исправить ошибку, создайте String из Substring

iteration.template = String(template[iterationSubstring.endIndex...substring.startIndex])

Тем не менее, вам настоятельно не рекомендуется создание диапазонов с индексами из разных строк (iterationSubstring и substring). Нарезать основную строку, индексы сохраняются.


Cra sh во втором (удаленном) примере произошел, потому что последний символ строки по индексу перед endIndex , это

template[template.startIndex..<template.endIndex] 

или короче

template[template.startIndex...]
...