Swift如何使用'self'作为泛型

时间:2015-12-17 03:39:42

标签: swift

我上课了 ManagedObject:NSManagedObject

和一些子类

MOProject:ManagedObject
MOOrganization:ManagedObject

等等

和ManagedObject

request(Router.Create(object: userInfo)).responseJSON(completionHandler: { (response) -> Void in
    switch response.result {
    case .Success(let result):
        Mapper<self>().map(result)
        completion(result: Result(success:"dd"))
    case .Failure( _):
        completion(result: Result(failure: Error.CacheNotExist))
    }
})

Mapper<self>().map(result)是错误的 我只想要T:ManagedObject

如果我启动MOProject我想要 Mapper< MOProject >().map(result)

如果我想要我想要的MOO组织 Mapper< MOOrganization >().map(result)

2 个答案:

答案 0 :(得分:2)

这里的问题是您正在尝试基于动态信息专门化泛型类型。斯威夫特不这样做,至少在没有帮助的情况下。

根据您使用它的位置,您可以放入与通用类型一起使用的尖括号中的内容会有所不同。如果您定义新的泛型类型(例如class Foo<T>func bar<T>(t: T)),则尖括号包含类型参数 - 这些类似于变量可以在类型定义中使用。如果您使用通用类型(例如var a: Foo<Int>或调用bar("some string"),隐含地调用bar<String>,则尖括号必须包含有效的类型名称。换句话说,泛型类型的定义是它的通用类型,而使用站点是它专用的地方。

此外,专业化只能在编译时进行。使用泛型类型时放在尖括号中的内容必须是编译器已知的类型名称,而不是仅在运行时生成某些内容的表达式。

因此,尝试在Mapper<self>上调用类方法时遇到的问题有两个:首先,self不是类型名称,其次,您需要放置{{1}的位置包含动态的东西。

您仍然可以根据self的运行时类型有条件地创建Mapper<MOProject>Mapper<MOOrganization> - 您只需自己进行调度,以便为此提供静态类型编译器。最简单(如果不是最优雅)的方法可能是打开类型:

self

(警告:在SE移动应用中进行编码,未经测试。但是这些行 应该工作......)

答案 1 :(得分:0)

根据您的使用情况,我假设您要在表达式中使用Self而不是self。第一个是类型,第二个是属性。

  

“类型的每个实例都有一个名为self的隐式属性,它与实例本身完全等效。您可以使用self属性在其自己的实例方法中引用当前实例。“

     

摘录自:Apple Inc.“The Swift Programming Language(Swift 2 Prerelease)。”iBooks。

但是,我不确定在您尝试使用Self的地方使用Self。我在查找Self的文档时遇到了麻烦。您经常会在协议定义中看到它。我不知道它是否在结构或类的上下文中是合法的。

更新:我只是尝试在类中使用Self并遇到编译错误:&#34; Self仅在协议中可用或作为类中方法的结果; &#34;

如果您提供了使用Mapper的方法的更多上下文,我可以建议修复。您是否有可以在该上下文中使用的泛型类型变量?