我今天开始学习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中做到这一点?
答案 0 :(得分:1)
首先使TestClass
正确。这就是您应该像这样初始化一个类的方法:
class TestClass : NSObject {
....
init(parameter1: String, parameter2: String) {
....
}
}
简单得多。现在,回到您的问题,
“ TestClass不能转换为AnotherClass”。
再次查看。您在问题中提到的那条线。您正在尝试这样做:
let obj = TestClass()
AnotherClass.executeTask(obj)
此行AnotherClass.executeTask(obj)
给您一个错误,因为实际上executeTask()
是实例方法。为此,您可以采取三种方式。
将static
关键字添加到func executeTask...
中,结果如下:static func executeTask(testClass : TestClass) {
您可以添加static
代替class
关键字。变成这样:class func executeTask(....
或者,如果仅实例化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)
}
}