В Swift, как сделать потомка из String?При попытке сделать это я получаю сообщение об ошибке «Наследование от внепротокольного, не классового типа« String »» - PullRequest
0 голосов
/ 04 декабря 2018

Я хочу, чтобы функция возвращала тип, который я могу добавить в новую функцию, но все еще можно распознать как String (все еще иметь все методы String и все еще может быть получен любым параметром, которыйполучил String).

Но когда я пытаюсь получить класс из String, я получаю эту ошибку:

Наследование от не протокола, не класса типа 'String '

Конечно, вместо этого я могу использовать расширение для расширения существующего String для добавления этой функции, но я чувствовал, что это загрязнит String ненужными и не связанными функциями для общего пользования.использовать.

Например, функции, которые я хочу добавить, могут выглядеть следующим образом:

class ImageUrl : String {

    func getImage (callback: ((UIImage?)->Void)) { ... }

}

или примерно так:

class Base64 : String {

    var image : UIImage { ... }
    var data : Data { ... }
    var string : String { ... }

}

Что может сбить с толку, если ярасширить эти функции до основного типа String.

Как я могу сделать это в Swift?Или есть ли обходной путь к этому?Спасибо.

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Вы не можете наследовать от String в Swift, потому что это struct.Вы можете добавить функциональность только с помощью extension, как вы упомянули, но это не позволит вам использовать хранимые свойства (допустимые вычисленные свойства, как вы написали в вопросе).

Однако, лучший подход для вашегонужно будет использовать композицию:

class Base64 {

    let str: String

    required init(value: String) {
        self.str = value
    }
}

Здесь вы можете добавить желаемый функционал.

0 голосов
/ 04 декабря 2018

Вы можете создать расширение String, используя модификатор fileprivate, чтобы избежать загрязнения глобального пространства имен.Функции будут доступны только для кода в исходном файле, а не в глобальном пространстве имен.

fileprivate extension String {
  var image : UIImage { ... }
  var data : Data { ... }
  var string : String { ... }
}
...