我上课了
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)
答案 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的方法的更多上下文,我可以建议修复。您是否有可以在该上下文中使用的泛型类型变量?