Swift中继承AVAsset后调用URL构造方法返回空资源问题求助
问题根因
AVAsset属于**类簇(Class Cluster)**类型,是苹果官方明确不建议直接继承的系统类。你自定义的子类没有实现类簇要求的内部私有初始化逻辑,所以调用父类的init(url:)构造器无法生成有效的子类实例。
可行解决方案
方案1:使用组合替代继承(官方推荐)
将AVAsset作为自定义类的内置属性封装,在此基础上扩展你需要的自定义属性和方法:
class TestAsset { let asset: AVAsset // 自定义扩展属性示例 var customIdentify: String? init(url: URL) { self.asset = AVAsset(url: url) } // 可按需转发AVAsset原有方法,或直接对外暴露asset属性调用 var duration: CMTime { asset.duration } }
方案2:继承AVURLAsset而非AVAsset
如果确实有继承的强需求,不要继承抽象父类AVAsset,改为继承它的可实例化具体子类AVURLAsset,这个类支持正常的子类化操作:
class TestAsset: AVURLAsset { // 自定义扩展属性示例 var customIdentify: String? } // 初始化可正常返回有效实例 let t = TestAsset(url: url!)
方案3:完整重写AVAsset的核心逻辑(不推荐)
如果必须直接继承AVAsset,你需要完整实现所有指定初始化方法,以及AVAsset核心属性(如duration、tracks等)的自定义getter逻辑,这种方案实现成本极高,仅特殊自定义资源加载场景下建议使用。
内容的提问来源于stack exchange,提问作者Javier Godoy Magaña
相关产品推荐
相关产品推荐

