gpt4 book ai didi

当相同的属性名称是可选的时,快速协议(protocol)一致性

转载 作者:行者123 更新时间:2023-12-04 14:45:06 28 4
gpt4 key购买 nike

当协议(protocol)将属性声明为可选而具体类型将其声明为非可选时,如何使具体类型符合协议(protocol)?

这是问题所在:

protocol Track {
var trackNumber: Int? { get } // not all tracks have a track number
}

struct SpotifyTrack {
let trackNumber: Int // all SpotifyTrack are guaranteed to have a track number
}

extension SpotifyTrack: Track {
var trackNumber: Int? {
return self.trackNumber // WARNING: All paths through this function will call itself
}
}

我不想做 trackNumber可选在 SpotifyTrack因为我知道 SpotifyTracks 的值(value)将永远存在。有没有比重命名属性更优雅的解决方案?

最佳答案

除了重命名符合类型的冲突属性之外,没有其他优雅的解决方案可以解决您的问题。

Swift 不允许同名的 2 个属性存在于一个类型中,即使它们的类型不同。另一方面,Int?Int是完全不同的类型,所以你不能有 trackNumber: Int满足trackNumber: Int?的协议(protocol)要求.

唯一的解决方案(除了更改 protocolstruct 中的类型)是重命名 SpotifyTrack 中的非可选属性并创建一个同名的可选计算属性,返回非可选属性。

protocol Track {
var trackNumber: Int? { get }
}
struct SpotifyTrack {
private let _trackNumber: Int
}
extension SpotifyTrack: Track {
var trackNumber: Int? { _trackNumber }
}

关于当相同的属性名称是可选的时,快速协议(protocol)一致性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62265690/

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