Swift-将自定义对象作为参数传递

时间:2019-01-31 16:03:27

标签: ios swift

我今天开始学习Swift,在我的第一个测试应用中,我遇到了这个错误:

  

TestClass不能转换为AnotherClass

以下是 TestClass

class TestClass : NSObject {

    var parameter1 : String = ""
    var parameter2 : String = ""

    override init() {        
        super.init()
    }

    func createJob(parameter1: String, parameter2: String) -> TestClass {
        self.parameter1 = parameter1
        self.parameter2 = parameter2
        return self;
    }  
}

这是 AnotherClass

class AnotherClass: NSObject {

    private struct internalConstants {
        static let test1 = "testData"
        static let test2 = "testData2"
    }

    var current : String

    override init() {
        self.current = internalConstants.test1
        super.init()
    }

    func executeTask(testClass : TestClass) {

        if testClass.parameter1 == "abc" {
            return;
        }
    }
}

这是 ViewController ,我在这里遇到编译器错误:

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let obj = TestClass()
        AnotherClass.executeTask(obj)
    }

}

AnotherClass.executeTask线正在给编译错误。

此行上作为参数发送的obj变量被Xcode突出显示,错误

  

TestClass不能转换为AnotherClass”。

在C#或目标C中,允许将自定义对象作为参数传递给另一个方法。如何在Swift中做到这一点?

3 个答案:

答案 0 :(得分:1)

首先使TestClass正确。这就是您应该像这样初始化一个类的方法:

class TestClass : NSObject {

    ....

    init(parameter1: String, parameter2: String) {
        ....
    }
}

简单得多。现在,回到您的问题,

  

“ TestClass不能转换为AnotherClass”。

再次查看。您在问题中提到的那条线。您正在尝试这样做:

let obj = TestClass()
AnotherClass.executeTask(obj)

此行AnotherClass.executeTask(obj)给您一个错误,因为实际上executeTask()是实例方法。为此,您可以采取三种方式。

  1. static关键字添加到func executeTask...中,结果如下:static func executeTask(testClass : TestClass) {

  2. 您可以添加static代替class关键字。变成这样:class func executeTask(....

  3. 或者,如果仅实例化AnotherClass,则更好。新建一个AnotherClass对象。如何实例化?你告诉我。但是这里:

  

let anotherClass = AnotherClass()

答案 1 :(得分:0)

将executeTask作为类函数实现

class func executeTask(testClass : TestClass) {
    if testClass.parameter1 == "abc" {
        return;
    }
}

或在AnotherClass中实例化vieweDidLoad

let obj = TestClass()
let another = AnotherClass()
another.executeTask(testClass: obj)

请注意,对executeTask的调用与参数名称稍有不同。

而且我确实没有理由要继承NSObject。

答案 2 :(得分:0)

我认为最好保持简单。在AnotherClass内创建ViewController的实例。

class ViewController: UIViewController {

    // Create an instance of AnotherClass which lives with ViewController.
    var anotherClass = AnotherClass()

    override func viewDidLoad() {
        super.viewDidLoad()

        let obj = TestClass()

        // Use the instance of AnotherClass to call the method.
        anotherClass.executeTask(testClass: obj)
    }

}