Xcode 斯威夫特';(int,int)——>$T4和x27;与';点';

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

我对斯威夫特还不太熟悉,所以犯了这个错误。我希望声明所要做的就是指定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
    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)(并添加对超类初始值设定项的调用)