두 개의 어레이를 동시에 반복
저는 스위프트가 처음입니다.자바 프로그래밍을 하고 있습니다.스위프트에서 코딩할 시나리오가 있습니다.
다음 코드는 Java에 있습니다.아래 시나리오에 대해 스위프트로 코딩을 해야 합니다.
// With String array - strArr1
String strArr1[] = {"Some1","Some2"}
String strArr2[] = {"Somethingelse1","Somethingelse2"}
for( int i=0;i< strArr1.length;i++){
System.out.println(strArr1[i] + " - "+ strArr2[i]);
}
몇 개의 배열을 신속하게 가지고 있습니다.
var strArr1: [String] = ["Some1","Some2"]
var strArr2: [String] = ["Somethingelse1","Somethingelse2"]
for data in strArr1{
println(data)
}
for data in strArr2{
println(data)
}
// I need to loop over in single for loop based on index.
인덱스를 기반으로 한 루프오버를 위한 구문에 대한 도움을 주실 수 있나요?
사용가능zip()
, 이것은 주어진 두 수열로부터 쌍의 수열을 만듭니다.
let strArr1 = ["Some1", "Some2"]
let strArr2 = ["Somethingelse1", "Somethingelse2"]
for (e1, e2) in zip(strArr1, strArr2) {
print("\(e1) - \(e2)")
}
시퀀스는 주어진 시퀀스/배열의 "공통 요소"만 열거합니다.길이가 다른 경우에는 긴 배열/시퀀스의 추가 요소는 단순히 무시됩니다.
스위프트 5를 사용하면 다음 4가지 플레이그라운드 코드 중 하나를 사용하여 문제를 해결할 수 있습니다.
#1. 기능 사용하기
가장 간단한 경우에는zip(_:_:)
초기 배열의 요소에 대한 새 쌍 시퀀스( tuple)를 만듭니다.
let strArr1 = ["Some1", "Some2", "Some3"]
let strArr2 = ["Somethingelse1", "Somethingelse2"]
let sequence = zip(strArr1, strArr2)
for (el1, el2) in sequence {
print("\(el1) - \(el2)")
}
/*
prints:
Some1 - Somethingelse1
Some2 - Somethingelse2
*/
#2. 사용하기Array
의 방법과 잠시 동안의 순환
또한 간단한 루프 및 반복기를 사용하여 두 개의 어레이를 동시에 루프할 수 있습니다.
let strArr1 = ["Some1", "Some2", "Some3"]
let strArr2 = ["Somethingelse1", "Somethingelse2"]
var iter1 = strArr1.makeIterator()
var iter2 = strArr2.makeIterator()
while let el1 = iter1.next(), let el2 = iter2.next() {
print("\(el1) - \(el2)")
}
/*
prints:
Some1 - Somethingelse1
Some2 - Somethingelse2
*/
#3. 에 적합한 커스텀 타입 사용
경우에 따라 이니셜 배열의 요소를 쌍으로 구성하는 고유한 유형을 생성할 수도 있습니다.이것은 당신의 타입을 다음과 같이 함으로써 가능합니다.IteratorProtocol
. 당신의 타입 또한 다음과 같게 함으로써 주의하십시오.Sequence
protocol, for loop에서 직접 인스턴스를 사용할 수 있습니다.
struct TupleIterator: Sequence, IteratorProtocol {
private var firstIterator: IndexingIterator<[String]>
private var secondIterator: IndexingIterator<[String]>
init(firstArray: [String], secondArray: [String]) {
self.firstIterator = firstArray.makeIterator()
self.secondIterator = secondArray.makeIterator()
}
mutating func next() -> (String, String)? {
guard let el1 = firstIterator.next(), let el2 = secondIterator.next() else { return nil }
return (el1, el2)
}
}
let strArr1 = ["Some1", "Some2", "Some3"]
let strArr2 = ["Somethingelse1", "Somethingelse2"]
let tupleSequence = TupleIterator(firstArray: strArr1, secondArray: strArr2)
for (el1, el2) in tupleSequence {
print("\(el1) - \(el2)")
}
/*
prints:
Some1 - Somethingelse1
Some2 - Somethingelse2
*/
#4. 사용하기
이전 예제의 대안으로 다음을 사용할 수 있습니다.AnyIterator
. 다음 코드는 그것의 가능한 구현을 보여줍니다.Array
확장 메서드:
extension Array {
func pairWithElements(of array: Array) -> AnyIterator<(Element, Element)> {
var iter1 = self.makeIterator()
var iter2 = array.makeIterator()
return AnyIterator({
guard let el1 = iter1.next(), let el2 = iter2.next() else { return nil }
return (el1, el2)
})
}
}
let strArr1 = ["Some1", "Some2", "Some3"]
let strArr2 = ["Somethingelse1", "Somethingelse2"]
let iterator = strArr1.pairWithElements(of: strArr2)
for (el1, el2) in iterator {
print("\(el1) - \(el2)")
}
/*
prints:
Some1 - Somethingelse1
Some2 - Somethingelse2
*/
시도해 보기:
zip([0,2,4,6], [1,3,5,7]).forEach {
print($0,$1)
}
zip([0,2,4,6], [1,3,5,7]).forEach {
print($0.0,$0.1)
}
당신도 할 수 있습니다.enumerate
하나 이상의 배열을 사용하고 인덱스를 사용하여 두 번째 배열의 내부를 살펴보았습니다.
스위프트 1.2:
for (index, element) in enumerate(strArr1) {
println(element)
println(strArr2[index])
}
스위프트 2:
for (index, element) in strArr1.enumerate() {
print(element)
print(strArr2[index])
}
스위프트 3:
for (index, element) in strArr1.enumerated() {
print(element)
print(strArr2[index])
}
당신은 사용할 수 있습니다.Range
아직도 사용하고 싶다면for in
.
var strArr1: [String] = ["Some1","Some2"]
var strArr2: [String] = ["Somethingelse1","Somethingelse2"]
for i in Range(start: 0, end: strArr1.count) {
println(strArr1[i] + " - " + strArr2[i])
}
for(var i = 0; i < strArr1.count ; i++)
{
println(strArr1[i] + strArr2[i])
}
그 정도면 됐다.스위프트를 사용해 본 적이 없으니 꼭 테스트해보세요.
최근 Swift 구문으로 업데이트됨
for i in 0..< strArr1.count {
print(strArr1[i] + strArr2[i])
}
> Incase of unequal count
let array1 = ["some1","some2"]
let array2 = ["some1","some2","some3"]
var iterated = array1.makeIterator()
let finalArray = array2.map({
let itemValue = iterated.next()
return "\($0)\(itemValue != nil ? "-"+itemValue! : EmptyString)" })
// 결과 : ["some1-some1", "some2-some2", "some3"]
언급URL : https://stackoverflow.com/questions/29217690/iterate-over-two-arrays-simultaneously
'programing' 카테고리의 다른 글
카트 및 체크아웃 페이지 우커머스에서 주문 합계를 제거하는 방법 (0) | 2023.09.23 |
---|---|
mariadb-client-core-10.5 : 종속: libreadline5(> = 5.2)이지만 설치할 수 없습니다. (0) | 2023.09.23 |
우커머스는 이름을 사용하여 상품 속성 ID를 가져옵니다. (0) | 2023.09.23 |
워드프레스/우커머스 훅이 불이 붙지 않습니까? (0) | 2023.09.23 |
인사이드 div 클릭을 비활성화하는 방법 (0) | 2023.09.23 |