Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xcode 在协议扩展中调用默认方法的问题_Xcode_Swift_Protocols - Fatal编程技术网

Xcode 在协议扩展中调用默认方法的问题

Xcode 在协议扩展中调用默认方法的问题,xcode,swift,protocols,Xcode,Swift,Protocols,通过仅在协议扩展中创建方法,可以定义默认方法。也就是说,如果该方法没有在类型(结构、类和枚举)中实现,那么调用该方法实际上是调用协议扩展中的方法 protocol TeamRecord { var wins: Int { get } var losses: Int { get } } protocol PlayoffEligible { var minimumWinsForPlayoff: Int{ get } } extension TeamRecord where

通过仅在协议扩展中创建方法,可以定义默认方法。也就是说,如果该方法没有在类型(结构、类和枚举)中实现,那么调用该方法实际上是调用协议扩展中的方法

protocol TeamRecord {
    var wins: Int { get }
    var losses: Int { get }
}

protocol PlayoffEligible {
    var minimumWinsForPlayoff: Int{ get }
}

extension TeamRecord where Self: PlayoffEligible {
    func isPlayoffEligible() -> Bool {
        return self.wins > minimumWinsForPlayoff
    }
} 

struct TeamInGroupA: TeamRecord{
    var wins: Int
    var losses: Int
    var minimunWinsForPlayoff: Int
}

let BasketBallLA = TeamInGroupA(wins: 19, losses: 20, minimunWinsForPlayoff: 10)
TeamRecord
PlayoffEligible
是两个协议,通过对
TeamRecord
的协议扩展使用类型约束,我将能够在扩展的实现中使用
PlayoffEligible
中的属性
minimumWinsForPlayoff

protocol TeamRecord {
    var wins: Int { get }
    var losses: Int { get }
}

protocol PlayoffEligible {
    var minimumWinsForPlayoff: Int{ get }
}

extension TeamRecord where Self: PlayoffEligible {
    func isPlayoffEligible() -> Bool {
        return self.wins > minimumWinsForPlayoff
    }
} 

struct TeamInGroupA: TeamRecord{
    var wins: Int
    var losses: Int
    var minimunWinsForPlayoff: Int
}

let BasketBallLA = TeamInGroupA(wins: 19, losses: 20, minimunWinsForPlayoff: 10)
问题:我在由符合
TeamRecord
协议的类型创建的对象中找不到函数
isplayAffiblible

问题:我如何调用协议扩展中的方法,该协议扩展使用了一个类型约束,使得该方法使用另一个协议的属性


非常感谢您的时间和帮助

您在结构TeamingGroupa中找不到PlayOffelible扩展方法,因为TeamingGroupa不采用PlayOffelible:

struct TeamInGroupA: TeamRecord {
将协议视为强加某种类型层次结构。如果一个结构采用了一个协议,它就是那个类型。因此,只有当TeamingGroupa“是”一个PlayoffEligible时,TeamingGroupa才会有PlayoffEligible扩展方法。但在您的代码中,它不是

如果您希望TeamingGroupa采用PlayOffelible,您需要明确表示:

struct TeamInGroupA: TeamRecord, PlayoffEligible {

在结构TeamingGroupA中找不到PlayoffEligible扩展方法,因为TeamingGroupA不采用PlayoffEligible:

struct TeamInGroupA: TeamRecord {
将协议视为强加某种类型层次结构。如果一个结构采用了一个协议,它就是那个类型。因此,只有当TeamingGroupa“是”一个PlayoffEligible时,TeamingGroupa才会有PlayoffEligible扩展方法。但在您的代码中,它不是

如果您希望TeamingGroupa采用PlayOffelible,您需要明确表示:

struct TeamInGroupA: TeamRecord, PlayoffEligible {

如果这是你的真实代码,你会遇到麻烦,因为你用两种不同的方式拼写“同一”变量-
minimunWinsForPlayoff
vs.
minimumWinsForPlayoff
@matt,是的,是的,你是对的,我的错。这是一个草率的工作。非常感谢您的详细观察。如果这是您的真实代码,您将遇到麻烦,因为您以两种不同的方式拼写“同一”变量-
minimunsinsforplayoff
vs.
minimumWinsForPlayoff
@matt,是的,您是对的,我的错。这是一个草率的工作。非常感谢你的详细观察。嗨,马特,非常感谢你的解释。我现在更明白了。嗨,马特,非常感谢你的解释。我现在更明白了。