Swift如何使用';自我';作为泛型

Swift如何使用';自我';作为泛型,swift,Swift,我有一节课 ManagedObject:NSManagedObject 还有一些子类 MOProject:ManagedObject MOOrganization:ManagedObject 等等 在ManagedObject中 request(Router.Create(object: userInfo)).responseJSON(completionHandler: { (response) -> Void in switch response.result { c

我有一节课
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))
    }
})
request(Router.Create(object:userInfo)).responseJSON(completionHandler:{(response)->中的Void
开关响应。结果{
案例。成功(让结果):
映射器().map(结果)
完成(结果:结果(成功:“dd”))
案例.失败(uu):
完成(结果:结果(失败:Error.CacheNotExist))
}
})
Mapper().map(结果)
为错误 我只想成为
T:ManagedObject

如果我启动一个项目,我想
Mapper().map(结果)

如果我开始组织我想要
Mapper().map(result)

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

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

摘自:苹果公司《Swift编程语言(Swift 2预发布)》,iBooks

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

更新:我刚刚尝试在类中使用
Self
,但遇到了一个编译器错误:“
Self
仅在协议中可用,或作为类中方法的结果;”


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

这里的问题是,您试图根据动态信息专门化泛型类型。斯威夫特不会这么做,至少在没有帮助的情况下不会

根据您使用泛型类型的位置,可以在与泛型类型配套的尖括号中放置的内容有所不同。如果要定义新的泛型类型(如
class Foo
func bar(t:t)
),则尖括号包含类型参数-这些参数类似于可以在类型定义中使用的变量。如果您正在使用泛型类型(如
var a:Foo
或调用
bar(“某些字符串”)
,这隐含着对
bar
的调用,则尖括号必须包含有效的类型名称。换句话说,泛型类型的定义是泛型的地方,而使用站点是专用的地方

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

因此,在
Mapper
上调用类方法有两个问题:第一,
self
不是类型名,第二,您希望放置
self
的位置包含动态内容

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

//...
case .Success(let result):
    switch self {
        case is MOProject:
            Mapper<MOProject>().map(result)
            completion(result: Result(success:"dd"))
        case is MOOrganization:
            Mapper<MOOrganization>().map(result)
            completion(result: Result(success:"dd"))
    }
case .Failure( _):
    //...
/。。。
案例。成功(让结果):
切换自身{
案例为MOProject:
映射器().map(结果)
完成(结果:结果(成功:“dd”))
案例是MOOrganization:
映射器().map(结果)
完成(结果:结果(成功:“dd”))
}
案例.失败(uu):
//...

(警告:在SE mobile app中编码,未经测试。但类似于这些内容的内容应该可以使用…

如果要使用
Self
类型,则必须将其大写。
Self
是一个属性。来自文档:“类型的每个实例都有一个名为self的隐式属性,该属性与实例本身完全相同。您可以使用self属性在其自身的实例方法中引用当前实例。”``如果我初始化MOProject,我希望
Mapper()。map(result)
如果我初始化MOOrganization,我需要
Mapper().map(结果)
``明白。我一时想不出你的答案。你可能需要重新构造你的代码,但我没有一个好的建议。这不是一个罕见的问题。我以前见过类似的问题。我只是当时找不到任何好的指导。非常感谢你,我已经解决了与你类似的id。谢谢你让我确定现在为什么它不起作用了