类名作为swift中的函数参数

时间:2016-01-11 22:02:46

标签: swift function class parameters parameter-passing

有没有办法引用放在另一个类中的函数内的类?

简化,第一类看起来像这样:

class ClassOne: UITableViewController, NSFetchedResultsControllerDelegate {

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)

        Client().fetchFunction(ClassOne)

    }

    func otherFunction(){
        ...
    }

}

第二类看起来像这样:

public class ClassTwo: NSManagedObject, NSFetchedResultsControllerDelegate {

    func fetchFunction(originClass: ???.Type){

        originClass.otherFunction()

    }

}

我解决问题的尝试不起作用,由" ???"放在上面。我输入的所有类型" ???"导致错误消息。

任何想法如何解决问题?我也试着关注Class as function parameter in Swift,但它似乎对我的情况不起作用。

2 个答案:

答案 0 :(得分:2)

作为参数的类名不是一个好主意,至少在你的情况下不是这样,并且你可以通过更干净的方法获得类似的结果,而不会失去Swift的类型安全性。

您可以通过添加协议来更清楚地实现这一目标:

protocol MyProtocol() {
    public func otherFunction()
}

可以在ClassTwo中使用:

public class ClassTwo: NSManagedObject, NSFetchedResultsControllerDelegate {

    func fetchFunction(obj: MyProtocol){
        obj.otherFunction()
    }
}

然后,您可以添加符合该协议的ClassOne扩展名:

extension ClassOne: MyProtocol {
    public func otherFunction() {
        // do your magic
    }
}

您可以将此技术应用于需要获取支持的所有类。

答案 1 :(得分:1)

您可以使用协议和通用功能的组合来执行您想要的操作。这样的事情应该有效:

protocol SomeProtocol {
    static func myFunc()
}

class ClassOne: SomeProtocol {
    class func myFunc() { print("Hello") }
}

class ClassTwo {

    func test<T: SomeProtocol>(type: T.Type) {
        T.myFunc()
    }

}

ClassTwo().test(ClassOne.self)   // Prints "Hello"

像其他一些回答者一样,我很难理解你要做的事情 - 我假设你试图调用一个类函数,否则就没有必要传递这个类型 - 你只会传递对象的实例。如果你真的想传递一个实例,那么修改代码如下:

protocol SomeProtocol {
    func myFunc()
}

class ClassOne: SomeProtocol {
    func myFunc() { print("Hello") }
}

class ClassTwo {

    func test<T: SomeProtocol>(object: T) {
        object.myFunc()
    }

}

ClassTwo().test(ClassOne())   // Prints "Hello"