두 어레이를 동시에 반복
저는 Swift를 처음 사용합니다. 저는 Java 프로그래밍을 해왔습니다. Swift로 코딩 할 시나리오가 있습니다.
다음 코드는 Java로되어 있습니다. 다음 시나리오를 위해 Swift로 코딩해야합니다.
// 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)")
}
시퀀스는 주어진 시퀀스 / 배열의 "공통 요소"만 열거합니다. 길이가 다른 경우 더 긴 배열 / 시퀀스의 추가 요소는 무시됩니다.
이 시도:
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])
}
Swift 5를 사용하면 문제를 해결하기 위해 다음 4 가지 플레이 그라운드 코드 중 하나를 사용할 수 있습니다.
#1. zip(_:_:)
기능 사용
가장 간단한 경우를 사용 zip(_:_:)
하여 초기 배열 요소의 새 쌍 (튜플) 시퀀스를 만들 수 있습니다 .
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
의 makeIterator()
방법 및 while 루프를
간단한 while 루프 및 반복기를 사용하여 두 배열을 동시에 루프하는 것도 쉽습니다.
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
*/
#삼. 다음을 준수하는 사용자 정의 유형 사용IteratorProtocol
경우에 따라 이니셜 배열의 요소를 쌍으로 만드는 고유 한 유형을 만들 수 있습니다. 이는 유형이 IteratorProtocol
. 유형도 Sequence
프로토콜을 준수하도록 함으로써 for 루프에서 직접 인스턴스를 사용할 수 있습니다.
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
As an alternative to the previous example, you can use AnyIterator
. The following code shows a possible implementation of it inside an Array
extension method:
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
*/
You could use Range
if you still want to use 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])
}
> 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)" })
// result : ["some1-some1","some2-some2","some3"]
for(var i = 0; i < strArr1.count ; i++)
{
println(strArr1[i] + strArr2[i])
}
That should do it. Never used swift before so make sure to test.
Updated to recent Swift syntax
for i in 0..< strArr1.count {
print(strArr1[i] + strArr2[i])
}
참고URL : https://stackoverflow.com/questions/29217690/iterate-over-two-arrays-simultaneously
'Development Tip' 카테고리의 다른 글
Android에서 해시 맵을 사용할 때 경고가 표시됩니다 (새 SparseArray 사용 (0) | 2020.11.16 |
---|---|
Laravel Fluent Query Builder 하위 쿼리와 조인 (0) | 2020.11.16 |
Docker 저장소에 Ubuntu에서 apt-get 업데이트 실행시 릴리스 파일이 없음 (0) | 2020.11.16 |
IntelliJ에서 "액세스는 패키지 전용 일 수 있습니다"메시지를 비활성화하는 방법은 무엇입니까? (0) | 2020.11.16 |
클래스 이름을 정의하기 위해 변수 String을 사용하여 JavaScript 객체를 만들려면 어떻게해야합니까? (0) | 2020.11.16 |