gpt4 book ai didi

swift - dynamicType + cast to protocol 导致崩溃

转载 作者:行者123 更新时间:2023-11-28 06:56:48 25 4
gpt4 key购买 nike

我有这些类(class):

AppDataProtocol.swift

public protocol AppDataProtocol{

var logoImagePath : String! {get}
var logoTitle : String? {get}
var logoSubtitle : String? {get}

var categories : [MainMenuOption]! {get}

static func contentElements(filter: ContentFilter?) -> [ContentElement]!
}

AppData.swift

class AppData{

static var sharedData : AppDataProtocol!

init(){}

}

CustomAppData.swift [符合AppDataProtocol的类]

class CustomAppData: AppData, AppDataProtocol {
// fulfills the AppDataProtocol, omitted for brevity
}

所以有了这些类,我尝试像这样动态设置类变量:

AppData.sharedData = CustomAppData()

然后像这样访问它:

// we need the class so we can call the class function
let appData = AppData.sharedData.dynamicType as! AppDataProtocol.Type
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
/*CRASH!*/
let contentElements = appData.contentElements(nil)

通过对存储在 AppData (sharedData) 的类变量中的实例调用 dynamicType,我应该得到符合 AppDataProtocol 的类,对吗?我认为问题是 dynamicType 实际上返回接口(interface)类型(即“AppDataProtocol”),我可能无法调用它本身的任何东西。有人可以告诉我为什么这不起作用吗?

最佳答案

OP 似乎希望有一个包含 Type 的类变量(即实际类)符合协议(protocol),但本身可能是可变的(即在不同时间持有该协议(protocol)的不同 Type s)。

问题是

class AppData{
static var sharedData : AppDataProtocol
init(){}
}

不会编译,因为 sharedData未初始化。一种解决方法是使其隐式展开,正如他在问题中所做的那样,相信当他确实访问它时,它 will 已被设置。问题在于,当他实际访问变量的 dynamicType 时这不是他所期望的——实际上是 ImplicitlyUnwrappedOptional<AppDataProtocol>.Type而不是 AppDataProtocol.Type .

解决方案就是声明static var sharedData : AppDataProtocol?而不是 static var sharedData : AppDataProtocol! , 然后在调用 dynamicType 之前打开它,因此:

let appData = (AppData.sharedData!).dynamicType // "CustomAppData.Type"

OP - 如果我对您的意图的假设偏离目标,请随时进行编辑...

关于swift - dynamicType + cast to protocol 导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33373649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com