2016-03-07 35 views
0

我正在编写一个试图使用自定义协议定义函数的工厂类。编译器会抛出一个错误,因为我不知道如何将协议定义添加到函数参数中。如何在函数参数中指定一个协议?

实施例:

protocol MyCustomFunctions { 
    func customFunction() 
} 

class MyVC: UIViewController, MyCustomFunctions { 
    func customFunction() {} 
} 

class Factory { 

    func createButton(specificVC: UIViewController) // need protocol here 
    { 
     specificVC.customFunction() // error thrown 
    } 
} 

如何能一个特定的变量定义中的协议?

或者有另一种方法吗?

回答

1

首先,公约规定班级以大写字母开头。

class MyVC: UIViewController, MyCustomFunctions { 
    func customFunction() {} 
} 

那么你需要的是在论证

class factory: NSObject { 

    func createButton(specificVC: MyVC) // you need a class that conforms to protocol here. 
    { 
     specificVC.customFunction() // no error anymore 
    } 
}  

你有另一种选择正确的类型。你可以简单地承诺你不会透露对象的完整类型,你只会说它是一个符合协议的不透明对象。

class factory: NSObject { 

    func createButton(specificVC: MyCustomFunctions) // you need a class that conforms to protocol here. 
    { 
     specificVC.customFunction() // no error anymore 
    } 
}  

奖金:

的方式,你可以有思索这一点,并找到一个答案是,当我打电话specificVC.customFunction()这个>

则抛出Error ......嗯......所以这对象只能运行此函数,如果它的类型实际上具有该函数。所以让我们来看一下参数类型 - UIViewController - .. UIViewController当然没有这个函数。这是MyVC或协议。

Swift中的类型安全性非常严格。只要“遵循类型流程”,你就会很好。

+0

默认情况下,如果您没有特定的原因,则不需要在swift中继承NSObject。 Factory类不应该继承任何东西。 –

+0

对不起,我是废话在伪代码。我实际上遵循你的两个建议。我的工厂实际上比这个例子更复杂。我有多种VC类型。我认为你的回答使我走向了正确的方向。谢谢。 –

+0

我加了一小笔奖金。 –

相关问题