代码之家  ›  专栏  ›  技术社区  ›  Prashant Tukadiya

Swift协议,其中带有==vs的约束:

  •  0
  • Prashant Tukadiya  · 技术社区  · 6 年前

    我有以下代码(请忽略拼写错误:)

    protocol Vehical {
        var wheelsCount:Int {get}
    }
    
    protocol LightVehical:Vehical {
        func tankWithPetrol (liters:Int)
    }
    
    protocol HeavyVehical:Vehical {
        func tankWithDisel(liters:Int)
    }
    
    protocol OwnsVehical {
        associatedtype VechicalType = Vehical
        var vehical:VechicalType {get}
    }
    
    // Here I have == for constraint  
    extension OwnsVehical where VechicalType == HeavyVehical {
        func fillTankWithDisel() {
    
        }
    }
     // Light Vehicle
    struct VolVOV90 : LightVehical {
    
        var wheelsCount: Int = 4
    
        func tankWithPetrol(liters: Int) {
    
        }
    }
         // Heavy Vehicle
    
    struct Van : HeavyVehical {
        func tankWithDisel(liters: Int) {
    
        }
    
        var wheelsCount: Int = 6
    
    
    }
    
    struct PersonWithHeavyVehical:OwnsVehical {
        typealias VechicalType = Van
        let vehical = Van()
    }
    

    现在当我试着

    let personWithHeavyV = PersonWithHeavyVehical()
    personWithHeavyV.fillTankWithDisel() // It is not compiling with ==
    

    如果我改变

    extension OwnsVehical where VechicalType == HeavyVehical 
    

    extension OwnsVehical where VechicalType : HeavyVehical 
    

    代码编译成功我没有发现==和之间的差异:任何人都可以帮助我理解它,谢谢

    2 回复  |  直到 6 年前
        1
  •  2
  •   jpcarreira    6 年前

    当你这样做时:

    extension OwnsVehical where VechicalType == HeavyVehical

    你告诉编译器 VechicalType 必须是 沉重的类型。这意味着这个方法 fillTankWithDisel 将只提供给 OwnsVehical 谁的 矢量型 是一个 HeavyVehical . 所以你不能打电话 灌满柴油 personWithHeavyV 因为 沉重的人 不是 沉重的 ,这是一个 Van .

    当你这样做时:

    extension OwnsVehical where VechicalType : HeavyVehical

    你告诉编译器 矢量型 符合 沉重的 协议,所以你可以打电话 personWithHeavyV.fillTankWithDisel 因为 沉重的人 ,通过遵守 所有者 ,无进一步限制,可以调用 灌满柴油 .

    如果你愿意 personWithHeavyV.fillTankWithDisel() 要编译,必须将struct PersonWithHeavyVehical的实现更改为以下内容:

    struct PersonWithHeavyVehical: OwnsVehical { typealias VechicalType = HeavyVehical let vehical = Van() }

    现在你有了 沉重的人 其VechicalType是 沉重的 从而允许您调用所需的方法。

        2
  •  0
  •   Ketan Odedra ikbal    6 年前
    1. == 操作员

      == 运算符检查其实例值是否相等, "equal to" //所以你在这里比较 VechicalType == HeavyVehical 哪个回来了 false

    2. : 操作员

      : 指定义变量的类型 你可以查一下这个 link