将Swift类作为参数传递,然后调用其中的一个类方法

8
我希望能够将一个类存储为变量,以便稍后可以调用其中的类方法,类似于以下示例代码:
class SomeGenericItem: NSObject
{
    var cellClass: AnyClass

    init(cellClass: AnyClass)
    {
        self.cellClass = cellClass
    }

    func doSomething(p1: String, p2: String, p3: String)
    {
        self.cellClass.doSomething(p1, p2: p2, p3: p3)
    }
}

class SomeClass: NSObject
{
    class func doSomething(p1: String, p2: String, p3: String)
    {
        ...
    }
}

我希望能够说出类似这样的话:

let someGenericItem = SomeGenericItem(cellClass: SomeClass.self)

someGenericItem.doSomething("One", p2: "Two", p3: "Three")

我试图弄清楚的是:
1) 如何定义协议,以便我可以调用类函数doSomething? 2) cellClass的声明需要是什么样子的? 3) 调用会是什么样子?
1个回答

3

协议无法定义类方法,但静态方法可以。您需要使您的包装器通用,并指定一个“where”约束,以确保被包装类型符合您的协议。

示例:

protocol FooProtocol
{
    static func bar() -> Void
}

class FooishClass : FooProtocol
{
    static func bar() -> Void
    {
        println( "FooishClass implements FooProtocol" )
    }
}

class FooTypeWrapper< T where T: FooProtocol >
{   
    init( type: T.Type )
    {
        //no need to store type: it simply is T
    }

    func doBar() -> Void
    {
        T.bar()
    }
}

使用:

let fooishTypeWrapper = FooTypeWrapper( type: FooishClass.self )
fooishTypeWrapper.doBar()

我发现这个方法可以工作,但是有一个奇怪的问题。只有当FooProtocol在调用“let fooishTypeWrapper = FooTypeWrapper(type: FooishClass.self)”的同一文件中时,我才能让它工作。如果它在另一个文件中,Swift会抱怨“class FooishClass:FooProtocol”的声明,说“类型'Foolish Class'不符合协议'Foo Protocol'”,尽管它确实符合。唯一的区别就是协议所在的文件。这导致我只能让这种方法在一个文件中工作一次,但是一旦我尝试在多个文件中使用它,我就无法编译。有什么想法吗? - John Bushnell
刚刚仔细检查了一遍,完全正常。你可能在某个地方打错了字 - 如果问题仍然存在,请发布你的代码。 - Gregzo
"协议不能定义类方法" 这并不是真的。协议使用static声明 类型方法需求 。类型方法需求可以通过使用类方法或静态方法来满足。 - newacct
你知道怎样为 init 添加默认参数吗?例如:init(type: T.Type = FooishClass.self)。我试过了但没成功。 - Dov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接