В документации Apple и во многих статьях предлагается преобразовать подстроку (string.subsequence) в строку, просто вызвав String(substring)
, и это действительно работает.
let str = "Hello world"
let hello = str.prefix(5) //create substr
//CREATE STRING FROM SUBSTRING
let hellostr = String(hello) //works
Однако если подстрока является необязательной, как показано ниже,
let str = Optional("Hello world")
let hello = str?.prefix(5) //create substr
//CREATE STRING FROM OPTIONAL SUBSTRING
let hellostr = String(hello) //gives error
Я получаю сообщение об ошибке
"No exact matches in call to initializer "
Что может быть причиной этой ошибки?
Спасибо за любые предложения.
Какова цель создания строки из nil
? Практически его нет, поэтому метод init
бессмысленен.
Вам необходимо развернуть необязательный Substring
, поскольку вы не можете напрямую создать String
из необязательного Substring
.
Вам нужно решить, как вы хотите обрабатывать значения nil
для hello
, и на основе этого выбрать подходящий вариант.
Вот несколько вариантов:
Используйте Optional.map
, чтобы создать необязательный String
из Substring
, если необязательный параметр имел ненулевое значение, и если необязательный параметр был nil
, присвойте nil
результату/
// hellostr will be nil if hello was nil, otherwise it will have a value
// The type of hellostr is Optional<String>
let hellostr = hello.map(String.init)
Если вы хотите, чтобы hellostr
всегда имел значение, вам необходимо указать значение по умолчанию либо для возвращаемого значения Optional.map
let hellostr = hello.map(String.init) ?? ""
или (как отметил Мартин Р. в комментариях) к Optional<Substring>
, переданному String.init
:
let hellostr = String(hello ?? "")
Вы также можете использовать необязательную привязку, чтобы заменить Optional.map
более подробным синтаксисом.
let hellostr: String
if let hello = hello {
hellostr = String(hello)
} else {
hellostr = ""
}
Альтернативой номеру 2 является let hellostr = String(hello ?? "")
Метод
init(_ substring: Substring)
, а неinit(_ substring: Substring?)
. Так чтоString(hello ?? Substring())
должно сработать. Кроме того, комментарии к коду «/ выдает ошибку» являются ложными и вводят в заблуждение (я думаю, неправильное копирование/вставка).