我正在使用外部SDK(通过在我的项目中包含他们的xcode项目)。 SDk在objective-c中正常工作,但是当我切换到swift时,我遇到了问题。
每当我实现其参数属于protocol类型的委托方法时,xcode突然给该全局声明的类的对象声明提供错误,即不在任何函数中。如果我评论该特定的委托方法,我将不会收到任何错误,并且它会成功编译/执行。
请检查以下快速代码,然后查看我的#comments
//CustomView is subclass of UIView
var customview : CustomView = CustomView() // #1 error as : Use of undeclared type CustomView
@IBAction func showCustomView(sender: AnyObject)
{
// CustomView configurations
}
#pragma CustomView Delegates
func CustomViewShown(view: AnyObject!) /// #2 delegate work properly
{
}
func CustomView(view: AnyObject!, didFailWithError error: NSError!)
// #3 if I keep this method uncommented it gives error to #1 line
// if I commented this method all other works fine without error.
{
}
令人惊讶的是上面的所有委托,SDK对于Objective-C工作正常,但不适用于swift。
根据我的小研究,我得出结论, 我们不能在swift中使用相同的类名和方法名,即在我的情况下是它的CustomView。如果我使用CustomView声明对象,我不能将它用作方法名称。
所以有人请证实,我是对还是不对?什么是这个问题的解决方案。
答案 0 :(得分:2)
它本质上是一个名称冲突的问题。
在类声明中,CustomView
是方法名称,但不是类名。所以,基本上,你的假设是正确的。
但是,你有一个解决方法。
假设在SDK中声明CustomView
。这是一个名为SomeSDK
的框架。然后你可以像这样引用CustomView
:
import SomeSDK
class ViewController: UIViewController {
var customview: SomeSDK.CustomView = SomeSDK.CustomView()
func CustomView(view: AnyObject!, didFailWithError error: NSError!) {
}
}
如果您不想在任何地方添加前缀SomeSDK.
,可以typealias
:
import SomeSDK
typealias SDKCustomView = CustomView // you can use `CustomView` here because there is no conflicting name.
class ViewController: UIViewController {
var customview: SDKCustomView = SDKCustomView()
func CustomView(view: AnyObject!, didFailWithError error: NSError!) {
}
}
答案 1 :(得分:0)
我可能错了,但似乎在swift中你也可以显式调用init函数。
而不是打电话:
var customview : CustomView = CustomView()
你可以致电:
var customview : CustomView = CustomView.init()
这适用于我的游乐场,让我知道它是如何为你工作的。这将允许您使用按原样命名的函数。