从数组中的对象检索成员时出现问题,类型 'Shape' 的值没有成员 'name'
Issue retrieving members from objects in array, value of type 'Shape' has no member 'name'
Swift 的新手,如果有人能指出正确的方向,我将不胜感激。我正在尝试从对象数组中提取成员值并输出为字符串,如下所示。这是在游乐场里面,如果这对情况有影响的话。
// Main Class for array building later
class Shape {
}
//Implement the protocol on a Triangle, Square, and Rectangle.
class Triangle:Shape, Polygon {
var a: Float
var b: Float
var c: Float
var name: String = "Triangle"
var sides: Int = 3
init(a: Float, b:Float, c: Float) {
self.a = a
self.b = b
self.c = c
}
func perimiter() -> Float {
return a+b+c
}
func area() -> Float {
let sp = (a+b+c)/2
let area = sqrtf(sp*(sp-a)*(sp-b)*(sp-c))
return area
}
}
class Square:Shape, Polygon {
var a: Float
var name: String = "Square"
var sides: Int = 4
init(a: Float) {
self.a = a
}
func perimiter() -> Float {
return a*4
}
func area() -> Float {
return a*2
}
}
class Rectangle:Shape, Polygon {
var a: Float
var b: Float
var name: String = "Rectangle"
var sides: Int = 4
init(a: Float, b: Float) {
self.a = a
self.b = b
}
func perimiter() -> Float {
return 2*(a*b)
}
func area() -> Float {
return a*b
}
}
protocol Polygon {
var name: String { get }
var sides: Int { get }
func perimiter() -> Float
func area() -> Float
}
//MARK: Create Instances of, return array of
func makeShapes() -> [Shape]{
let s1 = Triangle(a:3,b:4,c:5)
//print(s1.name) works fine here
//print(s1.perimiter().description)
//print(s1.area().description)
let s2 = Triangle(a:6,b:8,c:10)
let s3 = Square(a: 15)
let s4 = Square(a: 25)
let s5 = Rectangle(a:20,b:13)
let s6 = Rectangle(a:17,b:50)
return [s1,s2,s3,s4,s5,s6]
}
func draw (shapes: [Shape]) {
shapes.forEach { shape in
print(shape.name)
}
}
var shapes = makeShapes()
draw(shapes: shapes)
我可以看到它在游乐场的右侧传递对象,我什至可以在 makeShapes() 之外看到所有成员值,我只是无法将它们传给 print(),它给了我一个“类型的值没有成员错误。再次,任何关于我猜测的正确方向的帮助或推动是我所缺少的东西将不胜感激,提前感谢!
Shape
class 没有名为 name
的成员,正如错误所述。
无论如何,Shape 都不应该是 class。相反,它应该是一个协议。
protocol Shape {
var name: String { get }
}
或者您应该绘制多边形而不是形状。
func draw (shapes: [Polygon]) {
shapes.forEach { shape in
print(shape.name)
}
}
var shapes = makeShapes()
draw(shapes: shapes as! [Polygon])
Swift 的新手,如果有人能指出正确的方向,我将不胜感激。我正在尝试从对象数组中提取成员值并输出为字符串,如下所示。这是在游乐场里面,如果这对情况有影响的话。
// Main Class for array building later
class Shape {
}
//Implement the protocol on a Triangle, Square, and Rectangle.
class Triangle:Shape, Polygon {
var a: Float
var b: Float
var c: Float
var name: String = "Triangle"
var sides: Int = 3
init(a: Float, b:Float, c: Float) {
self.a = a
self.b = b
self.c = c
}
func perimiter() -> Float {
return a+b+c
}
func area() -> Float {
let sp = (a+b+c)/2
let area = sqrtf(sp*(sp-a)*(sp-b)*(sp-c))
return area
}
}
class Square:Shape, Polygon {
var a: Float
var name: String = "Square"
var sides: Int = 4
init(a: Float) {
self.a = a
}
func perimiter() -> Float {
return a*4
}
func area() -> Float {
return a*2
}
}
class Rectangle:Shape, Polygon {
var a: Float
var b: Float
var name: String = "Rectangle"
var sides: Int = 4
init(a: Float, b: Float) {
self.a = a
self.b = b
}
func perimiter() -> Float {
return 2*(a*b)
}
func area() -> Float {
return a*b
}
}
protocol Polygon {
var name: String { get }
var sides: Int { get }
func perimiter() -> Float
func area() -> Float
}
//MARK: Create Instances of, return array of
func makeShapes() -> [Shape]{
let s1 = Triangle(a:3,b:4,c:5)
//print(s1.name) works fine here
//print(s1.perimiter().description)
//print(s1.area().description)
let s2 = Triangle(a:6,b:8,c:10)
let s3 = Square(a: 15)
let s4 = Square(a: 25)
let s5 = Rectangle(a:20,b:13)
let s6 = Rectangle(a:17,b:50)
return [s1,s2,s3,s4,s5,s6]
}
func draw (shapes: [Shape]) {
shapes.forEach { shape in
print(shape.name)
}
}
var shapes = makeShapes()
draw(shapes: shapes)
我可以看到它在游乐场的右侧传递对象,我什至可以在 makeShapes() 之外看到所有成员值,我只是无法将它们传给 print(),它给了我一个“类型的值没有成员错误。再次,任何关于我猜测的正确方向的帮助或推动是我所缺少的东西将不胜感激,提前感谢!
Shape
class 没有名为 name
的成员,正如错误所述。
无论如何,Shape 都不应该是 class。相反,它应该是一个协议。
protocol Shape {
var name: String { get }
}
或者您应该绘制多边形而不是形状。
func draw (shapes: [Polygon]) {
shapes.forEach { shape in
print(shape.name)
}
}
var shapes = makeShapes()
draw(shapes: shapes as! [Polygon])