在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
}
}
在这里您可以添加您想要的功能。
我想要一个函数 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
}
}
在这里您可以添加您想要的功能。