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。谢谢你让我确定现在为什么它不起作用了