Преобразование необязательной подстроки в строку в Swift

В документации 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 "

Что может быть причиной этой ошибки?

Спасибо за любые предложения.

Метод init(_ substring: Substring), а не init(_ substring: Substring?). Так что String(hello ?? Substring()) должно сработать. Кроме того, комментарии к коду «/ выдает ошибку» являются ложными и вводят в заблуждение (я думаю, неправильное копирование/вставка).

Larme 05.07.2024 13:51

Какова цель создания строки из nil? Практически его нет, поэтому метод init бессмысленен.

vadian 05.07.2024 13:59
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам необходимо развернуть необязательный Substring, поскольку вы не можете напрямую создать String из необязательного Substring.

Вам нужно решить, как вы хотите обрабатывать значения nil для hello, и на основе этого выбрать подходящий вариант.

Вот несколько вариантов:

  1. Используйте 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)
    
  2. Если вы хотите, чтобы hellostr всегда имел значение, вам необходимо указать значение по умолчанию либо для возвращаемого значения Optional.map

    let hellostr = hello.map(String.init) ?? ""
    

    или (как отметил Мартин Р. в комментариях) к Optional<Substring>, переданному String.init:

    let hellostr = String(hello ?? "")
    
  3. Вы также можете использовать необязательную привязку, чтобы заменить Optional.map более подробным синтаксисом.

    let hellostr: String
    if let hello = hello {
      hellostr = String(hello)
    } else {
      hellostr = ""
    }
    

Альтернативой номеру 2 является let hellostr = String(hello ?? "")

Martin R 05.07.2024 14:45

Другие вопросы по теме