【问题标题】:Swift Generic Class implementing an Objective-C Protocol实现 Objective-C 协议的 Swift 泛型类
【发布时间】:2015-04-17 14:19:41
【问题描述】:

我的目的是在 Swift 中创建一个符合 Objective-C 协议的泛型类:

班级是:

class BaseViewFactoryImpl<T> : NSObject, BaseView {
  func getNativeInstance() -> AnyObject {
    return String("fsd")
  }
}

协议BaseView是:

@protocol BaseView < NSObject >

- (id)getNativeInstance;

@end

编译器告诉我:

Type 'BaseViewFactoryImpl<T>' does not conform to protocol 'BaseView'

如果我删除&lt;T&gt;,则没有错误。

这里有什么问题?如何获得正确的泛型类实现?

【问题讨论】:

标签: objective-c swift


【解决方案1】:

//BaseViewFactory.swift

class BaseViewFactoryImpl<T> : NSObject, BaseView {
    func getNativeInstance() -> AnyObject {
        return String("fsd")
    }

//BaseViewProtocol.h

@protocol BaseView <NSObject>

- (id)getNativeInstance;

@end

//BridgingHeader.h

#import "BaseClassProtocol.h"

您的代码应该可以工作。是否创建了桥接头来导入 obj-C 协议文件?

【讨论】:

    【解决方案2】:

    Starting with Swift 3,你需要使用Any,而不是AnyObject,来表示来自Objective-C的通用id值。

    这个构建没有错误:

    class BaseViewFactoryImpl<T> : NSObject, BaseView {
      func getNativeInstance() -> Any {
        return "fsd"
      }
    }
    

    【讨论】:

      【解决方案3】:

      如果您创建一个新的通用视图模型,当您尝试创建通用视图模型的任何子类时,您还需要将子类声明为通用类。这有点烦人。

      为了更好的方式,您可以使用 typealias 来声明实例的类型,而不是使用泛型:

      protocol BaseView {
          typealias T
          func getNativeInstance() -> T!
      }
      
      class StringViewModel : BaseView {
      
          typealias T = String
      
          func getNativeInstance() -> String! {
              return T()
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2017-03-19
        • 1970-01-01
        • 2015-01-01
        • 2022-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-14
        • 1970-01-01
        相关资源
        最近更新 更多