Ios swift中带有枚举和泛型的类扩展中的Where子句
我是泛型新手,我想把它应用到这个逻辑中 因此,我创建了一个用户类型的枚举。我有一个userModel对象,其中包含此用户类型信息 现在,我的UIViewController A将包含一个用户对象和一个tableView。根据用户类型,单元数量和单元设计也将发生变化 基本上,我不想把整个逻辑塞进cell-ForRowAtIndexPath和其他类似的方法中,这就是我研究泛型的原因 这是我的密码Ios swift中带有枚举和泛型的类扩展中的Where子句,ios,swift,generics,Ios,Swift,Generics,我是泛型新手,我想把它应用到这个逻辑中 因此,我创建了一个用户类型的枚举。我有一个userModel对象,其中包含此用户类型信息 现在,我的UIViewController A将包含一个用户对象和一个tableView。根据用户类型,单元数量和单元设计也将发生变化 基本上,我不想把整个逻辑塞进cell-ForRowAtIndexPath和其他类似的方法中,这就是我研究泛型的原因 这是我的密码 enum UserType : Int { case None =
enum UserType : Int {
case None = 0, Musician, Listener
}
class User {
var userType : UserType = .None
}
class A<T:User>: UIViewController {
var selectedUser: T?
}
extension A where T.userType : UserType.Musician
{
func foo() { print("Musician") }
}
我想知道为什么会发生此错误,以及我的方法是否错误。要创建
扩展,必须只提供编译时已知的信息userType
是User
的属性,因此它是运行时信息。它不能用于创建扩展名
但我认为你仍然可以从协议和泛型中获益。我不确定它是否适合你,但无论如何,这里有一些方法可以做到
您可以像这样为每种类型的用户声明协议
protocol UserProtocol {
var userType: UserType { get }
func doYourThing()
}
protocol MusicianProtocol: UserProtocol {}
protocol ListenerProtocol: UserProtocol {}
并创建UserProtocol
extension UserProtocol where Self: MusicianProtocol {
var userType: UserType { return .musician }
func doYourThing() {
print("Do-di-do!")
}
}
extension UserProtocol where Self: ListenerProtocol {
var userType: UserType { return .listener }
func doYourThing() {
print("Anything except vynil is garbage!")
}
}
func letsPlay(_ users: UserProtocol...) {
for u in users {
u.doYourThing()
}
}
let m = Musician()
let l = Listener()
letsPlay(m, l)
当然,通过这种方式,每个用户都需要单独的类
class Musician: MusicianProtocol {}
class Listener: ListenerProtocol {}
但是通过使用UserProtocol
extension UserProtocol where Self: MusicianProtocol {
var userType: UserType { return .musician }
func doYourThing() {
print("Do-di-do!")
}
}
extension UserProtocol where Self: ListenerProtocol {
var userType: UserType { return .listener }
func doYourThing() {
print("Anything except vynil is garbage!")
}
}
func letsPlay(_ users: UserProtocol...) {
for u in users {
u.doYourThing()
}
}
let m = Musician()
let l = Listener()
letsPlay(m, l)
要创建扩展名
,必须只提供编译时已知的信息userType
是User
的属性,因此它是运行时信息。它不能用于创建扩展名
但我认为你仍然可以从协议和泛型中获益。我不确定它是否适合你,但无论如何,这里有一些方法可以做到
您可以像这样为每种类型的用户声明协议
protocol UserProtocol {
var userType: UserType { get }
func doYourThing()
}
protocol MusicianProtocol: UserProtocol {}
protocol ListenerProtocol: UserProtocol {}
并创建UserProtocol
extension UserProtocol where Self: MusicianProtocol {
var userType: UserType { return .musician }
func doYourThing() {
print("Do-di-do!")
}
}
extension UserProtocol where Self: ListenerProtocol {
var userType: UserType { return .listener }
func doYourThing() {
print("Anything except vynil is garbage!")
}
}
func letsPlay(_ users: UserProtocol...) {
for u in users {
u.doYourThing()
}
}
let m = Musician()
let l = Listener()
letsPlay(m, l)
当然,通过这种方式,每个用户都需要单独的类
class Musician: MusicianProtocol {}
class Listener: ListenerProtocol {}
但是通过使用UserProtocol
extension UserProtocol where Self: MusicianProtocol {
var userType: UserType { return .musician }
func doYourThing() {
print("Do-di-do!")
}
}
extension UserProtocol where Self: ListenerProtocol {
var userType: UserType { return .listener }
func doYourThing() {
print("Anything except vynil is garbage!")
}
}
func letsPlay(_ users: UserProtocol...) {
for u in users {
u.doYourThing()
}
}
let m = Musician()
let l = Listener()
letsPlay(m, l)
但是你在代码中说T.userType应该是userType.music类型,但它不是一种类型,UserType是一个类型,但Musiner是一个枚举元素。所以你的意思是我不能检查t.UserType==.Musiner?当然可以,但不能像你那样在扩展声明中使用它。但是你在代码中说t.UserType应该是UserType.Musiner类型,但它不是一个类型,UserType是一个类型,但是Musiner是一个枚举元素。所以你的意思是我不能检查t.UserType==.Musiner?当然可以,但不能像你那样在扩展声明中使用它。谢谢。我会调查的谢谢。我会调查的