在Swift中,如何创建String的后代?尝试这样做时出现错误 "Inheritance from non-protocol, non-class type 'String'"

In Swift, how to make a descendant of String? I get error "Inheritance from non-protocol, non-class type 'String'" when trying to do that

我想要一个函数 return 一个我可以添加新函数的类型,但仍然可以被普遍识别为 String(仍然有所有 String 的方法并且仍然可以被接收到的任何参数接收 String).

但是当我尝试从 String 导出 class 时,我得到了这个错误:

Inheritance from non-protocol, non-class type '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 中执行此操作?或者有什么解决方法吗?谢谢。

您可以使用 fileprivate 修饰符创建 String 扩展,以避免污染全局命名空间。然后,这些函数将仅可用于源文件中的代码,而不是全局命名空间中的代码。

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

您不能从 Swift 中的 String 继承,因为它是 struct。您只能使用您提到的 extension 添加功能,但这不会让您使用存储的属性(允许您在问题中写的计算属性)。

但是,满足您需求的更好方法是使用组合:

class Base64 {

    let str: String

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

在这里您可以添加您想要的功能。