Ios swift中带有枚举和泛型的类扩展中的Where子句

Ios swift中带有枚举和泛型的类扩展中的Where子句,ios,swift,generics,Ios,Swift,Generics,我是泛型新手,我想把它应用到这个逻辑中 因此,我创建了一个用户类型的枚举。我有一个userModel对象,其中包含此用户类型信息 现在,我的UIViewController A将包含一个用户对象和一个tableView。根据用户类型,单元数量和单元设计也将发生变化 基本上,我不想把整个逻辑塞进cell-ForRowAtIndexPath和其他类似的方法中,这就是我研究泛型的原因 这是我的密码 enum UserType : Int { case None =

我是泛型新手,我想把它应用到这个逻辑中

因此,我创建了一个用户类型的枚举。我有一个userModel对象,其中包含此用户类型信息

现在,我的UIViewController A将包含一个用户对象和一个tableView。根据用户类型,单元数量和单元设计也将发生变化

基本上,我不想把整个逻辑塞进cell-ForRowAtIndexPath和其他类似的方法中,这就是我研究泛型的原因

这是我的密码

       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?当然可以,但不能像你那样在扩展声明中使用它。谢谢。我会调查的谢谢。我会调查的