首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >类型元数据补全函数,用于Crash | Crash访问某些不可用组件的类时

类型元数据补全函数,用于Crash | Crash访问某些不可用组件的类时
EN

Stack Overflow用户
提问于 2020-08-28 15:28:56
回答 1查看 155关注 0票数 0

当我试图在iOS 12上使用只包含iOS 14元素的类时,我遇到了崩溃。

这个类看起来像这样(编辑了一些不相关的东西)

代码语言:javascript
运行
复制
public class AssetFuture {
    public enum AssetRepresentation {
        case asset(asset: PHAsset)
        @available(iOS 14, *)
        case result(result: PHPickerResult)
    }
    @available(*, deprecated, message: "Use assetRepresentation instead")
    public var asset: PHAsset! {
        switch assetRepresentation {
        case .asset(asset: let asset):
            return asset
        default:
            return nil
        }
    }
    public let assetRepresentation: AssetRepresentation

    init(asset: PHAsset) {
        self.assetRepresentation = .asset(asset: asset)
    }

    @available(iOS 14, *)
    init(pickerResult: PHPickerResult) {
        self.assetRepresentation = .result(result: pickerResult)
}

我包装iOS14 only元素的方式不正确吗?

它会崩溃,并显示堆栈跟踪:

代码语言:javascript
运行
复制
Thread 1 Queue : com.apple.main-thread (serial)
#0  0x0000000100520748 in __abort_with_payload ()
#1  0x000000010051fcf8 in abort_with_payload_wrapper_internal ()
#2  0x000000010051fd2c in abort_with_payload ()
#3  0x00000001004dcb40 in dyld::halt(char const*) ()
#4  0x00000001004dcc6c in dyld::fastBindLazySymbol(ImageLoader**, unsigned long) ()
#5  0x00000001f126f708 in _dyld_fast_stub_entry(void*, long) ()
#6  0x00000001f126e210 in dyld_stub_binder ()
#7  0x0000000100637654 in type metadata completion function for AssetFuture.AssetRepresentation ()

整个项目可以在这里看到:https://github.com/eure/AssetsPicker/tree/iOS14

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-16 13:23:10

枚举不支持不可用类型

使用其他东西。

例如:

代码语言:javascript
运行
复制
public enum AssetRepresentation {
     public struct PHPickerResultWrapper {
         private let result: Any
         @available(iOS 14, *)
         public var value: PHPickerResult {
             return result as! PHPickerResult
         }
         @available(iOS 14, *)
         fileprivate init(_ result: PHPickerResult) {
             self.result = result
         }
     }
     case asset(asset: PHAsset)
     @available(iOS 14, *)
     case result(object: PHPickerResultWrapper)
 }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63629344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档