协议作为swift冲突中的参数类型

时间:2015-03-20 15:50:16

标签: ios objective-c xcode swift ios8

我正在使用外部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声明对象,我不能将它用作方法名称。

所以有人请证实,我是对还是不对?什么是这个问题的解决方案。

2 个答案:

答案 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()

这适用于我的游乐场,让我知道它是如何为你工作的。这将允许您使用按原样命名的函数。