如何使用通用约束类型属性实现 Swift 协议?

2024-06-28

我想要一个看起来像这样的协议:

protocol ReturnType {
    var returnType: ImmutableMappable.Type { get }
}

实现协议的枚举部分:

extension ShimEndPoint: ReturnType {
    var returnType: ImmutableMappable.Type {
        switch self {
        case .deAuthorize(_, _):
            return EmptyResponse.self
        case .authorize(_, _):
            return AuthorizeResponse.self
        case .step(_, _, _, _):
            return StepResponse.self 
        }
    }
}

EmptyResponse、AuthorizeResponse 和 StepResponse 都实现了 ImmutableMappable。 现在我想在函数调用中使用“returnType”属性:

return Shim.provider
    .request(endPoint)
    .timeout(7,
             scheduler: MainScheduler.asyncInstance)
    .retry(3)
    .mapObject(endPoint.returnType)

mapObject 行给出了以下编译器错误: “无法将类型“ImmutableMappable.Type”的值转换为预期参数类型“T.Type”

“mapObject”的函数签名是:

public func mapObject<T : ImmutableMappable>(_ type: T.Type) -> RxSwift.Observable<T>

如何定义和实现协议,以便将 returnType 传递给 mapObject 函数?

我发现了一个类似的问题,但不幸的是我无法在给出的答案的帮助下解决我的问题:从函数和方法返回受约束的泛型 https://stackoverflow.com/questions/27404137


就我个人而言,我觉得你的一些代码并没有真正意义。喜欢 :

extension ShimEndPoint: ReturnType {
    var returnType: ImmutableMappable.Type {
        switch self {
        case .deAuthorize(_, _):
            return EmptyResponse.self
        case .authorize(_, _):
            return AuthorizeResponse.self
        case .step(_, _, _, _):
            return StepResponse.self 
        }
    }
}

一个对象如何根据自身来确定自身的类型?然后返回一个与其本身不同的值类型?

因此,我在这里试图提供的帮助只是试图找到您想要实现的目标的解决方案,而不是解决现有代码。

我假设您尝试做的事情是确定要映射到的对象类型,具体取决于运行时的结果情况。枚举本身是ImmutableMappable它有3种情况:.authorize, .deauthorize and .step.

功能.request将返回此类型并根据情况确定要映射到的类型。但是,由于需要在编译时确定对象的类型,因此所有结果类型EmptyResponse, AuthorizeResponse and StepResponse这里必须遵循相同的协议(我假设,Response此处),结果也只会返回协议而不是特定的类类型。

return Shim.provider
    .request(endPoint)
    .timeout(7,
             scheduler: MainScheduler.asyncInstance)
    .retry(3)
    .flatMap { result: ImmutableMappable -> Observable<Response> in
       return Observable.create{
        switch result {
          case .authorize:
            observer.onNext(AuthorizeResponse())
          case .deAuthorize:
            //etc
          case step:
            //etc.
           }
        }
     }

希望这能回答您的问题!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用通用约束类型属性实现 Swift 协议? 的相关文章

  • 选择退出单个视图的自动布局?

    我有一个在代码中执行其子视图布局的视图 布局对于自动布局来说太复杂 并且自动布局会破坏布局代码 有没有办法强制自动布局不影响该视图的子视图 我尝试过重写layoutSubviews 但没有任何乐趣 谢谢你的帮助 每个情节提要或 XIB 启用
  • c# 变量声明上的泛型,这可能吗?

    我有以下问题 public class MyClass
  • RCTBatchedBridge 已弃用,并将在未来的 React Native 版本中删除

    我在我的反应本机应用程序中面临这个警告 如何解决这个问题任何建议都会有帮助 我的也有同样的问题现有的本机应用程序 我跟着与现有应用程序集成 https facebook github io react native docs integra
  • 为什么在 Quick 单元测试中会多次调用 before- 和 afterEach 块?

    我编写了一个测试用例 其中包含一些示例组 包括beforeEach and afterEach 我期望每个beforeEach and afterEach每个都会被调用一次it 唉 对于一个人来说it the beforeEach and
  • 弹出窗口不指向按钮

    我有一个与 iPhone 和 iPad 布局兼容的应用程序 对于 iPhone 布局 我为 iPad 创建了 Action Sheet 和 Pop over 问题是弹出窗口的箭头没有指向我单击的按钮 下面是我的代码 let actionSh
  • iOS 7 仅横向应用程序无法访问照片库

    我有一个仅限风景的应用程序 每当我访问照片库时 应用程序就会崩溃 因为UIImagePickerViewController正在尝试以纵向模式加载 应用程序在 iOS 5 和 6 中运行良好 我收到以下错误 由于未捕获的异常而终止应用程序
  • Cocoapods 和 Xcode,ld:找不到 -lAFNetworking 的库

    我有这个 pod 文件包含所有这些库 platform ios 7 0 target PP for iPad do pod AFNetworking 1 1 pod RaptureXML 1 0 pod NoticeView pod iVe
  • 来自应用程序的 Apple TV 上的 AirPlay 元数据 (AVPlayer - MPVolumeView)

    我的应用程序成功通过 AVPlayer 传输 MP3 我实现了一个 MPVolumeView 来引入 AirPlay 支持 效果很好 但我注意到我的苹果电视上的标题信息没有显示流式 MP3 中的任何内容 而只是显示 未知 信息 是否有办法从
  • 无法使用 double 类型的左值初始化“id _NonNull”类型的参数

    目标C 我有多个 double long long NSString 和 int 类型的变量 我想将它们放入一个数组中 以便在 CSV 文件中作为单行打印 NSArray ValArray NSArray arrayWithObjects
  • 访问 iPhone 上用户的短信

    有没有一种方法可以访问用户的短信 没有互联网连接 显然 不尝试获取客户的消息 并分析应用程序中的文本 如果没有 出于安全原因 这是完全可以理解的 但我想我还是会问 不 你只能发送它们 S http developer apple com l
  • 应用程序名称中的撇号

    我打算在 Apple 商店中发布一款标题中包含撇号的应用程序 我注意到 当 目标 名称包含撇号时 XCode 在构建代码时已经存在问题 我已经通过使用以下字符设法解决了这个问题 暂时 与以下相反 这似乎构建得不错 但我有点担心以后可能会发生
  • iOS 中的泰米尔字体

    我尝试安装泰米尔字体名称Bamini ttf in xcode 4 2我做了具体的改变info plist 但它没有显示在界面生成器中 任何人都可以帮我解决这个问题吗 据我所知 您安装的新字体永远不会在界面生成器中列出 但是您可以在项目中使
  • 在.NET中,Array仅扩展了IEnumerable,那么foreach循环遍历值类型数组时会出现装箱和拆箱吗?

    Array只是扩展了IEnumerable的非泛型版本 那么foreach循环遍历值类型数组时会不会出现装箱和拆箱呢 我猜不会 因为那会很蹩脚 如果我的猜测是正确的 那么 foreach 是如何遍历值类型数组的呢 它不使用Array Get
  • 图像持久化和延迟加载与 Dispatch_Async 的冲突

    我正在开发一个提要阅读器 我通过使用 nsxmlparser 解析 rss 提要来完成它 我还有从 CDATA 块中获取的缩略图对象 void parser NSXMLParser parser foundCDATA NSData CDAT
  • SpriteKit中滚动背景的速度逐渐增加

    我正在 SpriteKit 中制作一个简单的游戏 并且我有一个滚动背景 简单的情况是 在加载游戏场景时 一些背景图像彼此相邻放置 然后当图像滚动到屏幕外时 图像会水平移动 这是我的游戏场景中的代码didMoveToView method s
  • 规划带有透明覆盖图像的科尔多瓦相机插件

    我正在编写和应用程序 需要在相机上显示透明图像 例如作为构图指南 该应用程序必须至少在 iOS 和 Android 上发布 到目前为止 我已经找到了一个具有功能 iOS 源的插件 okstate plugin camera overlay
  • CAltimeter 回调永远不会触发

    使用我的 6 我一直在尝试使用 CoreMotion 的新 CMAltimeter 读取相对高度和压力 但是回调永远不会触发 我有一个非常相似的设置 它使用加速度计 陀螺仪和磁力计 他们似乎都工作得很好 想知道是否有人设法阅读 void v
  • 在滚动视图内的 ImageView 中裁剪缩放图像

    我已经做了很多努力 最后我需要帮助 谢谢 目标 1 如何将 imageView 放入 ScrollView 中 2 我如何在scrollView内部裁剪缩放图像 我在滚动视图中有一个 imageView 我想要缩放后裁剪图像 该图像显示在滚
  • 当Text超过Height时如何增加UITextView的高度

    我有一个 UITextView 当我在 5 6 行后输入数据时 数据正在向上滚动并且看不到 当输入的文本超过高度时 是否有任何属性可以用来增加 UITextView 的高度 请建议大家 使用此代码使 UITextView 的高度与其内部内容
  • iOS 7 导航栏在 viewDidAppear 上跳跃/拉伸

    I am trying to update my app for iOS 7 When my views appear on the screen you can see that there is a gap between the na

随机推荐