gpt4 book ai didi

swift - 符合 Swift 3.1 中的 Strideable 协议(protocol)

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

我正在经历转换为 Swift 3.1 的绝对喜悦我遇到了 Strideable 协议(protocol)的问题。以下代码无法编译;唯一的错误消息是类型“Segment”不符合 Strideable 协议(protocol)(也不符合 _Strideable)。四处搜索,我发现了一堆关于关联类型和嵌套类型的东西,但没有什么特别的。

struct segment: Equatable, Comparable, Hashable, Strideable {
var segTurn: Int
var segSegment: Int
typealias Stride = Int

init() {
segTurn = 0
segSegment = 12
}

init(segment: Int, turn: Int) {
segTurn = turn
segSegment = segment
}

var hashValue: Int {
get {
return "\(self.segTurn),\(self.segSegment)".hashValue
}
}

var description: String {
if segTurn == 0 && segSegment == 12 {
return "Start of Combat Segment 12"
}
return "Turn: \(self.segTurn) Segment: \(self.segSegment)"
}

static func successor() -> segment {
return self + 1
}

static func advanced(by n: Int) -> segment {
return self + n
}

static func distance(to other: segment) -> Int {
return other - self
}

static postfix func ++(theSeg:inout segment) -> segment {
theSeg = theSeg + 1
return theSeg
}

static func +(lhs:segment, rhs:Int) -> segment {
var intSeg = lhs.segSegment + rhs
var intTurn = lhs.segTurn
while intSeg > 12 {
intTurn += 1
intSeg = intSeg - 12
}
while intSeg < 1 {
intTurn -= 1
intSeg = intSeg + 12
}

return segment(segment: intSeg, turn: intTurn)
}

static func -(lhs:segment, rhs:Int) -> segment {
var intSeg = lhs.segSegment - rhs
var intTurn = lhs.segTurn
while intSeg > 12 {
intTurn += 1
intSeg = intSeg - 12
}
while intSeg < 1 {
intTurn -= 1
intSeg = intSeg + 12
}

return segment(segment: intSeg, turn: intTurn)
}

static func ==(lhs:segment, rhs:segment) -> Bool {
let areEqual = lhs.segTurn == rhs.segTurn &&
lhs.segSegment == rhs.segSegment

return areEqual
}

static func <(lhs:segment, rhs:segment) -> Bool {
var isLessThan = false
if lhs.segTurn < rhs.segTurn {
isLessThan = true
} else if lhs.segTurn == rhs.segTurn && lhs.segSegment < rhs.segSegment {
isLessThan = true
}
return isLessThan

}

最佳答案

以下是您需要修改以使其工作的内容:

  1. 从 Segment 中的所有函数中删除静态关键字。 (将它们保留为实例方法)
  2. 将所有运算符函数移到段结构定义之外。

然后您的代码将如下所示,并且在 Swift 3.1 中编译时不会出现错误/警告:

struct Segment: Equatable, Comparable, Hashable, Strideable {
var segTurn: Int
var segSegment: Int
typealias Stride = Int

init() {
segTurn = 0
segSegment = 12
}

init(segment: Int, turn: Int) {
segTurn = turn
segSegment = segment
}

var hashValue: Int {
get {
return "\(self.segTurn),\(self.segSegment)".hashValue
}
}

var description: String {
if segTurn == 0 && segSegment == 12 {
return "Start of Combat Segment 12"
}
return "Turn: \(self.segTurn) Segment: \(self.segSegment)"
}

func successor() -> Segment {
return self + 1
}

func advanced(by n: Int) -> Segment {
return self + n
}

func distance(to other: Segment) -> Int {
return other - self
}
}

postfix func ++(theSeg:inout Segment) -> Segment {
theSeg = theSeg + 1
return theSeg
}

func +(lhs:Segment, rhs:Int) -> Segment {
var intSeg = lhs.segSegment + rhs
var intTurn = lhs.segTurn
while intSeg > 12 {
intTurn += 1
intSeg = intSeg - 12
}
while intSeg < 1 {
intTurn -= 1
intSeg = intSeg + 12
}

return Segment(segment: intSeg, turn: intTurn)
}

func -(lhs:Segment, rhs:Int) -> Segment {
var intSeg = lhs.segSegment - rhs
var intTurn = lhs.segTurn
while intSeg > 12 {
intTurn += 1
intSeg = intSeg - 12
}
while intSeg < 1 {
intTurn -= 1
intSeg = intSeg + 12
}

return Segment(segment: intSeg, turn: intTurn)
}

func ==(lhs:Segment, rhs:Segment) -> Bool {
let areEqual = lhs.segTurn == rhs.segTurn &&
lhs.segSegment == rhs.segSegment

return areEqual
}

func <(lhs:Segment, rhs:Segment) -> Bool {
var isLessThan = false
if lhs.segTurn < rhs.segTurn {
isLessThan = true
} else if lhs.segTurn == rhs.segTurn && lhs.segSegment < rhs.segSegment {
isLessThan = true
}
return isLessThan
}

关于swift - 符合 Swift 3.1 中的 Strideable 协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44217659/

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