Swift中能否创建以父类对象为参数的初始化器?
在Swift中用父类对象作为参数的初始化器实现方案
当然可以啦!在Swift里完全能实现以父类对象作为参数的自定义初始化器,针对你这个UIImage子类的场景,我给你整理了具体的实现方法:
核心实现代码
class Image: UIImage { var poeticDescription: String? // 你想要的自定义初始化器,接收UIImage对象 init(with image: UIImage) { // 这里可以先给poeticDescription设置默认值,比如空字符串或者nil super.init(cgImage: image.cgImage!, scale: image.scale, orientation: image.imageOrientation) } // 注意:因为UIImage遵循NSCoding协议,子类必须实现这个required初始化器 // 如果你的场景不需要处理解码(比如从xib/storyboard加载),直接抛错即可 required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } }
代码说明
- 初始化器的核心是调用父类对应的指定初始化器:把传入的
UIImage对象的cgImage、scale、imageOrientation这几个核心属性传递给父类,这样你的子类实例就能完整继承原始图片的所有数据。 - 必须实现
required init?(coder:)是因为UIImage有这个协议要求的初始化器,子类必须遵守。
扩展用法(可选)
如果想在初始化的时候直接设置poeticDescription,可以扩展一个带双参数的初始化器:
// 新增初始化器,同时接收图片和描述 init(with image: UIImage, poeticDescription: String) { self.poeticDescription = poeticDescription super.init(cgImage: image.cgImage!, scale: image.scale, orientation: image.imageOrientation) }
使用示例
// 创建原始UIImage对象 let originalSunset = UIImage(named: "sunset")! // 用自定义初始化器创建子类实例 let myPoeticImage = Image(with: originalSunset) myPoeticImage.poeticDescription = "橙红染透天际,晚风揉碎金波" // 或者用扩展的初始化器直接设置描述 let myDirectImage = Image(with: originalSunset, poeticDescription: "云烧半边天,影落浅滩边")
内容的提问来源于stack exchange,提问作者Ben G
相关产品推荐
相关产品推荐

