2016-09-12 4 views
0

신속하게 배우려고합니다. 내가 할 때 :사용자 정의 유형의 배열에서 단일 요소를 수정하는 방법

var myIntArray = [Int](count: 3, repeatedValue: 0) 
myIntArray[0] = 1 
myIntArray[1] = 11 
myIntArray[2] = 111 

// prints "my array: [1, 11, 111]" 
NSLog("my int array: [%d, %d, %d]", myIntArray[0], myIntArray[1], myIntArray[2]) 
예상대로 작동

,하지만이 같은 클래스의 INT를 포장 할 때 :

class Foo { 
    var bar = 0 
} 

var myWrappedIntArray = [Foo](count: 3, repeatedValue: Foo()) 
myWrappedIntArray[0].bar = 1 
myWrappedIntArray[1].bar = 11 
myWrappedIntArray[2].bar = 111 

// prints "my array: [111, 111, 111]" 
NSLog("my wrapped int array: [%d, %d, %d]", myWrappedIntArray[0].bar, myWrappedIntArray[1].bar, myWrappedIntArray[2].bar) 

하나의 요소를 수정하려고 할 때 전체 배열을 수정하는 것 같다. 여기서 내가 뭘 잘못하고 있니?

+0

아마'repeatedValue'에 대한 나의 인수는 단일'Foo' 인스턴스를 만들고이 인스턴스에 대한 포인터로 배열을 채 웁니다? 그러나 그것을 고치는 방법? – Kevin

+0

"NSlog"대신 "print"를 사용하지 않는 이유는 무엇입니까? –

+0

@RashmiRanjanmallick iOS 개발에서 NSLog를 사용하는 데 익숙해 져서 문제의 실제와 관련이 있습니까? – Kevin

답변

1

이 사건의 경우는 Struct를 사용하는 것이 좋습니다 :

당신이 참조 유형 값과 같은 [Foo] 사용하여 작업하는 경우있어에서
struct Foo { 
    var bar = 0 
} 

var myWrappedIntArray = [Foo](count: 3, repeatedValue: Foo()) 
myWrappedIntArray[0].bar = 1 
myWrappedIntArray[1].bar = 11 
myWrappedIntArray[2].bar = 111 

// prints "my array: [1, 11, 111]" 
print("my wrapped int array: [%d, %d, %d]", myWrappedIntArray[0].bar, myWrappedIntArray[1].bar, myWrappedIntArray[2].bar) 

. 그러나 Struct은 값이 입력되고 고유 한 배열의 각 요소를 만듭니다.

myWrappedIntArray[0].barmyWrappedIntArray[n].bar의 동일한 개체를 참조하고 있습니다.

생성자 때문에.

var myWrappedIntArray = [Foo](count: 3, repeatedValue: Foo()) 

당신은 배열의 각 요소 대신 배열의 각 인덱스에 대한 새로운 클래스의 생성을위한 Foo() 참조를 반복합니다.

+0

내 유스 케이스가 다르긴하지만 내 문제를 재현 할 수있는 가장 작은 예제이다. – Kevin

+0

내 대답을 편집한다. –

+0

모든 요소에 대해'Foo' 인스턴스로 배열을 만들려면 어떻게해야합니까? 빈 배열을 만들고'Foo' 인스턴스를 수동으로 추가해야합니까, 아니면 모든 요소에 대해 새로운 인스턴스를 생성하는'init (count : repeatedValue :)'와 같은 것이 있습니까? – Kevin

관련 문제