스위프트의 역범위
스위프트에서 리버스 레인지로 작업할 수 있는 방법이 있습니까?
예를 들어,
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
'programing' 카테고리의 다른 글
POSIX 실시간 신호를 사용하는 사람과 그 이유는? (0) | 2023.09.23 |
---|---|
MySQL - 조건부 카운트(GROUP BY) (0) | 2023.09.23 |
Npm install에서 경고가 표시되고 npm 감사 수정이 작동하지 않음 (0) | 2023.09.23 |
$location으로 AngularJS url 변경 (0) | 2023.09.23 |
C#에서 XSLT 스타일시트를 적용하는 방법 (0) | 2023.09.23 |