programing

어레이의 정확한 복제 사본을 만들려면 어떻게 해야 합니까?

lastmoon 2023. 7. 31. 21:50
반응형

어레이의 정확한 복제 사본을 만들려면 어떻게 해야 합니까?

어레이를 정확히 복제하려면 어떻게 해야 합니까?

Swift에서 배열을 복제하는 것에 대한 정보를 찾는 데 어려움을 겪고 있습니다.

사용해 보았습니다..copy()

var originalArray = [1, 2, 3, 4]
var duplicateArray = originalArray.copy()

어레이는 Swift에서 완전한 가치의 의미를 가지고 있기 때문에 화려한 것이 필요하지 않습니다.

var duplicateArray = originalArray당신이 필요한 것은 전부입니다.


배열 내용이 참조 유형인 경우 예, 포인터만 개체에 복사합니다.내용의 전체 복사본을 수행하려면 대신map각 인스턴스의 복사본을 수행합니다.다음을 준수하는 Foundation 클래스의 경우NSCopying프로토콜, 당신은 사용할 수 있습니다.copy()방법:

let x = [NSMutableArray(), NSMutableArray(), NSMutableArray()]
let y = x
let z = x.map { $0.copy() }

x[0] === y[0]   // true
x[0] === z[0]   // false

여기에는 Swift의 가치 의미론이 다음과 같은 이유로 사용자를 보호하는 데 도움이 되는 함정은 다음과 같습니다.NSArray불변의 배열을 나타냅니다.copymethod는 자신에 대한 참조만 반환하므로 위의 테스트에서 예상치 못한 결과를 얻을 수 있습니다.

네이트의 대답에는 세 번째 옵션이 있습니다.

let z = x.map { $0 }  // different array with same objects

EDITED * 편집이 여기서 시작됩니다.

위의 연산자는 기본적으로 아래와 같으며 아래의 등호 연산자를 사용하면 배열을 변경하지 않으면 복사되지 않으므로 성능이 향상됩니다(이것은 설계상).

let z = x

여기서 더 읽어보기: https://developer.apple.com/swift/blog/ ?id=10

편집됨 * 편집은 여기서 끝납니다.

이 배열에 추가하거나 제거하면 원래 배열에 영향을 주지 않습니다.그러나 배열에 포함된 개체의 속성을 변경하면 원래 배열에 표시됩니다.배열의 개체는 복사본이 아니기 때문에(배열이 원시 숫자가 아닌 개체를 보유하고 있다고 가정).

네이트 말이 맞습니다.기본 배열로 작업하는 경우 중복 배열을 원래 배열에 할당하기만 하면 됩니다.

완전성을 위해 NSA rray 개체를 작업하는 경우 다음을 수행하여 NSA rray의 전체 복사본을 작성합니다.

var originalArray = [1, 2, 3, 4] as NSArray

var duplicateArray = NSArray(array:originalArray, copyItems: true)

일반 개체에 대해 수행할 수 있는 작업은 복사를 지원하는 프로토콜을 구현하고 개체 클래스가 다음과 같은 프로토콜을 구현하도록 하는 것입니다.

protocol Copying {
    init(original: Self)
}

extension Copying {
    func copy() -> Self {
        return Self.init(original: self)
    }
}

그런 다음 복제를 위한 어레이 확장:

extension Array where Element: Copying {
    func clone() -> Array {
        var copiedArray = Array<Element>()
        for element in self {
            copiedArray.append(element.copy())
        }
        return copiedArray
    }
}

그리고 코드와 샘플을 보고 이 요지를 확인하는 것이 거의 그것입니다.

일부 클래스 개체의 배열 항목을 복사하려는 경우.그러면 NSCopy 프로토콜을 사용하지 않고 아래 코드를 따를 수 있지만 개체에 필요한 모든 매개 변수를 사용하는 init 메서드가 있어야 합니다.여기 놀이터에서 테스트할 예를 위한 코드가 있습니다.

class ABC {
    
    var a = 0
    func myCopy() -> ABC {
        
        return ABC(value: self.a)
    }
    
    init(value: Int) {
        
        self.a = value
    }
}

var arrayA: [ABC] = [ABC(value: 1)]
var arrayB: [ABC] = arrayA.map { $0.myCopy() }

arrayB.first?.a = 2
print(arrayA.first?.a)//Prints 1
print(arrayB.first?.a)//Prints 2

언급URL : https://stackoverflow.com/questions/27812433/how-do-i-make-a-exact-duplicate-copy-of-an-array

반응형