Xcode 斯威夫特';(int,int)——>$T4和x27;与';点';
我对斯威夫特还不太熟悉,所以犯了这个错误。我希望声明所要做的就是指定4个值,以便为直线对象创建2个点对象。所以直线(10,20,20,40)应该在(10,20)和(20,40)处创建两个点。但我得到的错误是“(Int,Int)->$T4”与“Point”不相同Xcode 斯威夫特';(int,int)——>$T4和x27;与';点';,xcode,swift,swift-playground,Xcode,Swift,Swift Playground,我对斯威夫特还不太熟悉,所以犯了这个错误。我希望声明所要做的就是指定4个值,以便为直线对象创建2个点对象。所以直线(10,20,20,40)应该在(10,20)和(20,40)处创建两个点。但我得到的错误是“(Int,Int)->$T4”与“Point”不相同 class Point { var x: Int = 0 var y: Int = 0 init(){ x = 0 y = 0 } init(x: Int, y: Int) { self.x = x s
class Point {
var x: Int = 0
var y: Int = 0
init(){
x = 0
y = 0
}
init(x: Int, y: Int) {
self.x = x
self.y = y
}
}
class Line: Point {
var pointA: Point
var pointB: Point
init(p1x: Int, p1y: Int, p2x: Int, p2y: Int) {
self.pointA(p1x, p1y)
self.pointB(p2x, p2y)
}
}
var lineA = Line(p1x:10, p1y:20 , p2x:20 , p2y:40)
行的
init
中的代码没有意义。这是无效的Swift:
self.pointA(p1x, p1y)
self.pointB(p2x, p2y)
你不能像那样在变量名后面加括号!另外,您没有正确编写init
。这里有一个可能的解决方案:
class Line: Point {
var pointA: Point
var pointB: Point
init(p1x: Int, p1y: Int, p2x: Int, p2y: Int) {
self.pointA = Point(x:p1x, y:p1y)
self.pointB = Point(x:p2x, y:p2y)
super.init()
}
}
但正如安东尼奥已经说过的,这完全取决于你想做什么。我上面的代码将使您的代码正确编译,但我不知道它是否符合您的要求,因为您尝试执行的操作完全无法猜测。在初始值设定项中,您无法创建实例-您只是尝试引用两个属性,就好像它们是方法一样。正确的方法是:
init(p1x: Int, p1y: Int, p2x: Int, p2y: Int) {
self.pointA = Point(x: p1x, y: p1y)
self.pointB = Point(x: p2x, y: p2y)
}
尽管存在一个架构错误:行
继承自点
,但我认为这两个类之间没有关系-您至少应该调用超类初始值设定项,但是传递什么呢
相反,我只在行
中定义一个新属性,并重用点
中已有的属性:
class Line: Point {
var pointB: Point
init(p1x: Int, p1y: Int, p2x: Int, p2y: Int) {
self.pointB = Point(x: p2x, y:p2y)
super.init(x: p1x, y: p1y)
}
}
我不知道这是否有意义(取决于您想要实现什么)-如果没有,那么我只会使
行
不从点继承。如果您需要一个通用接口,但实现方式不同,那么您可以使用这两个类采用的协议。我认为您需要将Line.init中的代码更改为self.pointA=Point(x:p1x,y:p1y);self.pointB=Point(x:p2x,y:p2y)(并添加对超类初始值设定项的调用)