swift - 创建从多个协议(protocol)继承的协议(protocol)类型的对象时出错

标签 swift swift-protocols

在下面的代码中,有3个协议(protocol):WheeledVehicleWheeledVehicle(继承自Wheeled车辆)

protocol Wheeled {
    var numberOfWheels: Int { get }
}

protocol Vehicle {
    var maker: String { get }
    var owner: String {get set}
    var ownerKid: String { get }
}

protocol WheeledVehicle: Wheeled, Vehicle {
  // simply just combine Wheeled and Vehicle
}

class Bike: Vehicle, Wheeled {
let numberOfWheels: Int = 0
var ownerKid: String = "Junior"

var maker: String {
    return "Ford"
}

var owner: String {
    get {
        return "Bob"
        }
        set {
            ownerKid = "\(newValue) Junior"
        }
    }
}


let bike: Bike = Bike()

let wheeledVehicleBike: WheeledVehicle = bike //error: value of type 'Bike' does not conform to specified type 'WheeledVehicle'

问题:几乎是错误本身,我不明白,为什么类型 Bike 的值不符合指定类型 WheeledVehicle

非常感谢您的时间和帮助。

最佳答案

基本上:因为不符合

要让编译器知道 Bike 符合 WheeledVehicle,您必须指定它。编译器不会只是假定,因为它们都遵循相同的协议(protocol),所以它们可以相互赋值。

同理下面的不行。

class A { var a : String = "" }
class B { var a : String = "" }

var a : A = A()
var b : B = a // cannot convert value of type 'A' to specified type 'B'

或者更简单

class A {  }
class B {  }

var a : A = A()
var b : B = a // cannot convert value of type 'A' to specified type 'B'

编译器不关心这两种类型看起来是否相似 - 它们必须相似

如果您的 WheeledVehicle 添加了一个 func,您的示例中会发生什么情况? Bike 是否不再符合它?

使 Bike 符合 WheeledVehicle唯一方法是显式声明它:class Bike : WheeledVehicle !

关于swift - 创建从多个协议(protocol)继承的协议(protocol)类型的对象时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37576780/

相关文章:

ios - 尝试用 Swift 协议(protocol)理解一些东西

swift - 难以理解 Swift 协议(protocol)扩展中的 `Associated Types`

swift - 仅在 TestFlight 版本和 IOS 14 中显示键盘后应用程序崩溃

ios - 使用 AVAudioPlayer 控制锁定屏幕上的音频

swift - 使用 SpriteKit 在 Swift 中按名称获取 TileDefinition

swift - 如何减小每个圆象限的大小以产生间隙

ios - 为什么我不能在 UITableViewCell 内的 UIView 中设置两个顶角圆角?

ios - Swift 协议(protocol)中 IBAction 的更好策略是什么?

swift - 我如何使用类型(: someVar) as a proper Type in Swift?

Swift 类型删除尝试 : "Reference to invalid associated type"