programing

스위프트의 역범위

muds 2023. 9. 23. 23:09
반응형

스위프트의 역범위

스위프트에서 리버스 레인지로 작업할 수 있는 방법이 있습니까?

예를 들어,

for i in 5...1 {
  // do something
}

무한 루프입니다.

스위프트의 최신 버전에서는 코드가 컴파일되지만 런타임 시 오류가 발생합니다.

치명적 오류:opperBound < lowerBound와 범위를 형성할 수 없습니다.

제가 사용할 수 있다는 것을 압니다.1..5요를 합니다.j = 6 - i합니다.j나의 지표로써 더 더 읽을만한 게 없을까 해서요

업데이트 최신 Swift 3 (Swift 4에서 계속 작동)

를 .reversed() 범위에서의

for i in (1...5).reversed() { print(i) } // 5 4 3 2 1

아니면stride(from:through:by:)

for i in stride(from:5,through:1,by:-1) { print(i) } // 5 4 3 2 1

stride(from:to:by:)합니다는(는) 합니다.

for i in stride(from:5,to:0,by:-1) { print(i) } // 5 4 3 2 1

최신 Swift 2 업데이트

, 을 시킵니다.reverse사용됩니다.

for i in (1...5).reverse() { print(i) } // 5 4 3 2 1

스트라이드는 Xcode 7 베타 6에서 재작업되었습니다.새로운 용법은 다음과 같습니다.

for i in 0.stride(to: -8, by: -2) { print(i) } // 0 -2 -4 -6
for i in 0.stride(through: -8, by: -2) { print(i) } // 0 -2 -4 -6 -8

그것은 또한 다음을 위해 작동합니다.Doubles:

for i in 0.5.stride(to:-0.1, by: -0.1) { print(i) }

경계에 대한 부동 소수점 비교를 주의해야 합니다.

Swift 1.2 이전 편집: Xcode 6 Beta 4 현재 by 및 Reverse Range는 더 이상 존재하지 않습니다 :[

범위를 반대로 설정하는 경우에는 역기능만 사용하면 됩니다.

for i in reverse(1...5) { println(i) } // prints 5,4,3,2,1

0x7ffff에 의해 게시된 것처럼 임의의 정수만큼 반복하고 증가시키는 데 사용할 수 있는 새로운 스트라이드 구성이 있습니다.애플도 부동 소수점 지원이 오고 있다고 밝혔습니다.

그의 답변에서 출처:

for x in stride(from: 0, through: -8, by: -2) {
    println(x) // 0, -2, -4, -6, -8
}

for x in stride(from: 6, to: -2, by: -4) {
    println(x) // 6, 2
}

이것의 비대칭성에 대해 우려되는 점이 있습니다.

for i in (1..<5).reverse()

...이와 반대로:

for i in 1..<5 {

이고, 에 입니다 이고를 써야 한다는 입니다..reverse()엄지손가락이 아픈 것처럼 튀어나오는.이것은 C 스타일의 루프에 비하면 정말 보기 흉합니다. C 스타일은 카운트 업과 카운트 다운이 대칭적입니다.그래서 루프는 C스타일을 쓰는 편이었습니다.하지만 스위프트 2.2에서는 루프를 위한 C 스타일이 사라지고 있습니다!는 이 하는 C C 교체하느라 .reverse()— . 도대체 왜가 없는 것일까요?t —다.

하지만 기다려요!스위프트입니다. 우리는 우리의 운영자를 정의할 수 있습니다.시작합니다.

infix operator >>> {
    associativity none
    precedence 135
}

func >>> <Pos : ForwardIndexType where Pos : Comparable>(end:Pos, start:Pos)
    -> ReverseRandomAccessCollection<(Range<Pos>)> {
        return (start..<end).reverse()
}

이제 제가 말씀드릴 수 있는 것은

for i in 5>>>1 {print(i)} // 4, 3, 2, 1

이것은 제 코드에서 발생하는 가장 일반적인 경우만 다루지만, 가장 일반적인 경우는 훨씬 더 멀기 때문에 현재 제가 필요로 하는 것은 이것뿐입니다.

교환원 때문에 내부적으로 위기가 있었습니다.입니다를 것입니다.>.., 의..<하지만 이지 않아요.수 이라고 요. 점이 아닌 다음에는 점을 사용할 수 없습니다. 라고 표시됩니다.를 고려했습니다...>했습니다와 판단했습니다...<은..>>>그것은 당신에게 소리친다는 것입니다. "아래로!" (물론 당신은 다른 연산자를 자유롭게 생각할 수 있습니다.하지만 제 조언은 "초대칭성에 대해서는 정의를 내리라"는 것입니다.<<<..< 그리고 요가 <<<그리고.>>>대칭적이고 타이핑하기 쉬운.)


스위프트 3 버전 (Xcode 8 시드 6):

infix operator >>> : RangeFormationPrecedence
func >>><Bound>(maximum: Bound, minimum: Bound) ->
    ReversedRandomAccessCollection<CountableRange<Bound>> 
    where Bound : Comparable, Bound.Stride : Integer {
        return (minimum..<maximum).reversed()
}

스위프트 4 버전 (Xcode 9 베타 3):

infix operator >>> : RangeFormationPrecedence
func >>><Bound>(maximum: Bound, minimum: Bound)
    -> ReversedRandomAccessCollection<CountableRange<Bound>>
    where Bound : Comparable & Strideable { 
        return (minimum..<maximum).reversed()
}

Swift 4.2 버전 (Xcode 10 베타 1):

infix operator >>> : RangeFormationPrecedence
func >>><Bound>(maximum: Bound, minimum: Bound)
    -> ReversedRandomAccessCollection<Range<Bound>>
    where Bound : Strideable { 
        return (minimum..<maximum).reversed()
}

Swift 5 버전 (Xcode 10.2.1):

infix operator >>> : RangeFormationPrecedence
func >>><Bound>(maximum: Bound, minimum: Bound)
    -> ReversedCollection<Range<Bound>>
    where Bound : Strideable {
        return (minimum..<maximum).reversed()
}

베타를 진행하면서 이 질문에 대한 답이 조금 바뀐 것 같습니다. 4 타 4 으로,by()과.ReversedRange언어에서 type이 제거되었습니다.범위를 반대로 변경하려는 경우 이제 다음과 같은 옵션을 선택할 수 있습니다.

를 만든 : 합니다를 합니다.reverse()그것을 뒤집는 기능을 합니다.

for x in reverse(0 ... 4) {
    println(x) // 4, 3, 2, 1, 0
}

for x in reverse(0 ..< 4) {
    println(x) // 3, 2, 1, 0
}

새 2: stride()시작 및 종료 인덱스뿐만 아니라 반복할 양을 지정하는 함수를 포함하는 베타 4에 추가된 함수.

for x in stride(from: 0, through: -8, by: -2) {
    println(x) // 0, -2, -4, -6, -8
}

for x in stride(from: 6, to: -2, by: -4) {
    println(x) // 6, 2
}

또한 이 게시물에 새로운 전용 범위 조작자도 포함시켰음을 참고하세요...되었습니다로 되었습니다...<.

편집: Xcode 6 베타 5 릴리스 노트에서 Apple은 이 문제를 해결하기 위해 다음과 같은 제안을 추가했습니다.

ReverseRange가 제거되었습니다. lazy(x..)를 사용합니다.

여기 예가 있어요.

for i in lazy(0...5).reverse() {
    // 0, 1, 2, 3, 4, 5
}

Xcode 7, 베타 2 (< Swift 3.0):

for i in (1...5).reverse() {
  // do something
}

개발자 설명서에 따라 Xcode 8.0+(Swift 3.0+) 업데이트, 2020년 12월 8일 기준 제공:

  • 컬렉션 내용을 변경하지 않고 컬렉션을 역으로 반복하려면 다음을 사용합니다.reversed-
let word = "Backwards"
for char in word.reversed() {
    print(char, terminator: "")
}
// Prints "sdrawkcaB"

이 경우 컬렉션 주변의 포장지가 컬렉션의 내용을 읽고 역순으로 반환합니다.

  • 컬렉션의 내용을 되돌리려면 형식 이니셜라이저를 사용하고 컬렉션을 제공합니다.reversed 하면 인 새 이렇게 하면 내용이 같지만 반대인 새 컬렉션이 됩니다.
let reversedWord = String(word.reversed())
print(reversedWord)
// Prints "sdrawkcaB"
  • 또한 일반 함수를 사용하여 컬렉션의 내용을 일반 순서와 마찬가지로 역순으로 반환할 수 있습니다.
for countdown in stride(from: 3, to: 0, by: -1) {
    print("\(countdown)...")
}
// 3...
// 2...
// 1...

에.from.to,by입니다.stride내용을 거꾸로 읽습니다.

에.from.to,by입니다.stride원래 순서대로 내용을 읽어봅니다.

참고: 컬렉션에는 배열, 세트, 사전 및 기타 전문화된 컬렉션이 포함됩니다.수집이 반복 가능한 한 이러한 기술은 효과가 있을 것입니다.

번째 참고 사항: 2020년 12월 8일 현재 Swift 버전 및 관련 Xcode 버전은 https://swiftly.dev/swift-versions에서 확인할 수 있습니다.이 참조에 따르면, Xcode 8.0+는 Swift 3.0과 연관되어 있는데, 이는 다음과 같습니다.reverse()ereversed().

스위프트 3, 4+: 이렇게 하면 됩니다.

for i in sequence(first: 10, next: {$0 - 1}) {

    guard i >= 0 else {
        break
    }
    print(i)
}

결과: 10, 9, 8 ... 0

원하는 대로 맞춤 제작할 수 있습니다.자세한 내용은 참조 참조

이것은 또 다른 방법일 수 있습니다.

(1...5).reversed().forEach { print($0) }

역수는 역() 함수를 사용합니다.

Van:Int // 번호 입력

fori in 1...n.reverse() {Print(i)}

언급URL : https://stackoverflow.com/questions/24372559/reverse-range-in-swift

반응형