【问题标题】:Pass a Swift class as parameter, and then call a class method out of it传递一个 Swift 类作为参数,然后从中调用一个类方法
【发布时间】:2015-04-18 03:50:52
【问题描述】:

我希望能够将类存储为变量,以便以后可以从中调用类方法,如下所示:

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) 如何定义协议以便我可以调用类 func doSomething?
2) cellClass 的声明需要是什么?
3)电话会是什么样子?

【问题讨论】:

    标签: ios swift protocols swift-protocols


    【解决方案1】:

    协议不能定义类方法,但是静态方法就可以了。 你需要你的包装器是通用的,并指定一个'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'”,即使它确实如此。唯一的区别是协议在哪个文件中。这导致我一次使用这种方法,但是一旦我尝试在多个文件中使用它,我就无法编译。有什么想法吗?
    • 刚刚仔细检查,工作绝对正常。您可能在某处有错字 - 如果问题仍然存在,请发布您的代码。
    • “协议不能定义类方法” 这不是真的。协议用static 声明类型方法要求。使用类方法或静态方法的类可以满足类型方法要求。
    • 你知道向init 添加默认参数的方法吗?例如init(type: T.Type = FooishClass.self)我无法让它工作
    猜你喜欢
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多