gpt4 book ai didi

swift - 转换为约束协议(protocol)无法访问默认方法

转载 作者:行者123 更新时间:2023-11-28 15:55:05 25 4
gpt4 key购买 nike

我正在尝试访问协议(protocol)扩展中定义的默认方法实现,该协议(protocol)扩展在实现中受限于一个类。 “常规”声明工作正常,但是当我尝试转换为协议(protocol)时,我无法访问协议(protocol)上默认定义的方法,尽管该类型满足 where 子句。

请考虑这个例子:

class Person {

var name: String
init(name: String) {
self.name = name
}
}

class Hero: Person {

var ability: String
init(name: String, ability: String) {
self.ability = ability
super.init(name: name)
}
}

class Pilot: Person {

var callSign: String
init(name: String, callSign: String) {
self.callSign = callSign
super.init(name: name)
}
}

class Programmer: Person {
var favoriteLanguage: String
init(name: String, favoriteLanguage: String) {
self.favoriteLanguage = favoriteLanguage
super.init(name: name)
}
}

// define a protocol
protocol PersonPresenter: class { }
// extend it where the conformer is a type of Person
extension PersonPresenter where Self: Person {

func displayName() {
print(name.uppercased())
}
}

// conform subclasses of Person to PersonPresenter
extension Hero: PersonPresenter { }
extension Pilot: PersonPresenter { }
extension Programmer: PersonPresenter { }

let myHero = Hero(name: "Hiro", ability: "Bend time & space")
myHero.displayName() // prints 'HIRO'

let myPilot = Pilot(name: "Pete", callSign: "Maverick")
myPilot.displayName() // prints 'PETE'

let myProgrammer = Programmer(name: "Chris", favoriteLanguage: "Swift")
myProgrammer.displayName() // prints 'CHRS'

let people: [Person] = [myHero,myPilot,myProgrammer]

if let presenter = people[0] as? PersonPresenter {
presenter.displayName() // Errror, PerseonPresenter is not a subtype of 'Person'
}

我想找到一种在满足 where 约束的同时转换为 PersonPresenter 的方法,以免被迫尝试转换为每个特定的子类以访问协议(protocol)扩展的默认实现。或者不必使父类(super class)(可能在许多其他地方使用)符合协议(protocol)。

最佳答案

真正的问题是您正在扩展一个空协议(protocol)。

通过转换为 Hero,编译器知道它是 Person 的子类,然后它满足扩展约束。

但是当转换到协议(protocol) PersonPresenter 本身时,编译器不知道是否可以满足约束(作为一个人)。

如果您在协议(protocol)中声明要求,它将起作用:

protocol PersonPresenter: class { 
func displayName()
}

关于swift - 转换为约束协议(protocol)无法访问默认方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41906552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com