gpt4 book ai didi

ios - 如何公开提供动态数据但在编译时可访问的 API?

转载 作者:行者123 更新时间:2023-12-01 18:34:24 27 4
gpt4 key购买 nike

如何在两个依赖模块之间公开 API 以供编译时使用?
在 iOS/Swift 应用程序中工作时, SDK A 公开了支持的功能列表 API,它向第 3 方提供支持的功能名称(字符串数组)的集合 申请 B .现在在应用程序 B 中,开发人员在编写可能出现拼写错误的代码时需要使用支持的功能(开发人员无法在编译时了解数组值,但只能从 SDK 文档中了解)。 SDK A 无法提供任何 枚举 API,因为它们动态填充支持的功能列表。
在这种情况下,如何公开 API 以便 申请 B 能够在编译时获得功能名称吗?应用程序 B 团队想要类似于 enum 的东西,这样就不会有任何打字错误的可能性。另一方面,SDK A 无法将其提供为 枚举 因为列表是动态创建的。
例子
假设 SDK 名为 WearableSDK提供一个在初始化后调用的 API,

func supportedWearableModel() -> [String]
现在使用 WearableSDK 的应用程序需要在与其他 API 通信时传递模型名称,即
sdk.connectWith(String)
我们看到,当开发人员调用 connectWith 函数时,可能会传递错误的模型名称。但是如果 WearableSDK 被设计成一个枚举,那么开发人员就不会担心这种类型的错误。例如,
func supportedWearableModel() -> [ModelEnum]
sdk.connectWith(ModelEnum)
但不幸的是,这不可能使其成为枚举,因为支持的模型名称数组是动态生成的,并不总是固定的。
备注 支持的模型的总集合是固定的。
如何处理这种情况?

最佳答案

看起来您所寻找的只是防止动态创建预定义的支持功能。因此,您所需要的只是提供客户端无法以不安全的方式创建的 token (例如使用字符串案例)。你可以做这样的事情:

// SDK part
public protocol Feature : CustomStringConvertible {}
public extension Feature where Self : RawRepresentable, RawValue : CustomStringConvertible {
var description: String {
return rawValue.description
}
}

public struct AnyFeature {
public let feature : Feature
internal init<X>(_ base: X) where X : Feature {
self.feature = base
}
}

public final class SDKFacade {

public func supportedWearableModel() -> [AnyFeature] {
return []
}

public func connectWith(_ feature: AnyFeature) {
// no need to check
}

// In case that client wants to create Feature dynamically to pass it in method above

public func createFeature<X>(from draft: X) throws -> AnyFeature where X : Feature {
guard isAccessible(draft) else {
throw FeatureNotSupported()
}
return AnyFeature(draft)
}

private func isAccessible(_ draft: Feature) -> Bool {
return false
}

}

extension SDKFacade {
struct FeatureNotSupported : Swift.Error {}
}
客户端将如下所示:

// Client part

let facade = SDKFacade()
let models = facade.supportedWearableModel()
facade.connectWith(models[0])

由于构造函数的可见性级别,客户端根本无法创建 AnyFeature。将来可以通过抽象和将类型与功能协议(protocol)上的类型删除相关联来增强此解决方案,该协议(protocol)通过 SDK 提供一些类型绑定(bind)的功能。

关于ios - 如何公开提供动态数据但在编译时可访问的 API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62753779/

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