답변:
Swift의 구조체는 값으로 전달되지만 inout수정자를 사용 하여 배열을 수정할 수 있습니다 (아래 답변 참조). 클래스는 참조로 전달됩니다. Array그리고 DictionarySwift에서는 구조체로 구현됩니다.
NSArray있기 때문에 사용하지 않는 것이 좋습니다 NSArray.
inoutStructs와 함께 사용하면 어떨까요?
함수 매개 변수 연산자의 경우 다음을 사용합니다.
let (기본 연산자이므로 let 을 생략 할 수 있음 )을 사용하여 매개 변수를 상수로 만듭니다.
var 를 변수로 만듭니다 (로컬로 수정할 수 있지만 함수에 전달 된 외부 변수에는 영향을주지 않습니다). 및
inout의는 그것에게 입출력 매개 변수를 확인합니다. 인-아웃은 실제로 값이 아닌 참조로 변수를 전달하는 것을 의미합니다. 그리고 그렇게 참조하여 패스를 통과, 참조 값을 받아도에 의해뿐만 아니라 필요 및 - foo(&myVar)단지 대신foo(myVar)
그래서 다음과 같이하십시오.
var arr = [1, 2, 3]
func addItem(inout localArr: [Int]) {
localArr.append(4)
}
addItem(&arr)
println(arr) // it will print [1, 2, 3, 4]
정확히 말하면 이것은 단지 참조가 아니라 외부 변수에 대한 실제 별칭입니다. 따라서 모든 변수 유형으로 이러한 트릭을 수행 할 수 있습니다 (예 : 정수 (새 값 할당 가능)). 좋은 관행이며 이와 같은 기본 데이터 유형을 수정하는 것은 혼란 스러울 수 있습니다.
inout위치가 변경되었습니다. 즉func addItem(localArr: inout [Int])
var더 이상 함수 매개 변수 속성에 사용할 수 없습니다.
인터페이스 BoxedArray<T>를 구현 Array하지만 모든 기능을 저장된 속성에 위임 하는 자신을 정의하십시오 . 따라서
class BoxedArray<T> : MutableCollection, Reflectable, ... {
var array : Array<T>
// ...
subscript (index: Int) -> T {
get { return array[index] }
set(newValue) { array[index] = newValue }
}
}
사용 BoxedArray당신은을 사용하십시오 어디서나 Array. 할당은 BoxedArray참조에 의한 것이며 클래스이므로 Array인터페이스를 통해 저장된 속성에 대한 변경 사항 은 모든 참조에 표시됩니다.
String의 하위 유형입니다 Any당신은하지만 import Foundation다음 String의 하위 유형이된다는 AnyObject.
Swift 버전 3-4 (XCode 8-9)의 경우
var arr = [1, 2, 3]
func addItem(_ localArr: inout [Int]) {
localArr.append(4)
}
addItem(&arr)
print(arr)
같은 것
var a : Int[] = []
func test(inout b : Int[]) {
b += [1,2,3,4,5]
}
test(&a)
println(a)
???
func test(b: inout [Int])... 아마도 이것은 오래된 구문입니다. 저는 2016 년에만 Swift에 들어갔고이 답변은 2014 년의 것이므로 상황이 달라졌 을까요?
한 가지 다른 옵션은 어레이 소비자가 필요에 따라 소유자에게 요청하도록하는 것입니다. 예를 들어 다음과 같은 내용이 있습니다.
class Account {
var chats : [String]!
var chatsViewController : ChatsViewController!
func InitViewController() {
chatsViewController.getChats = { return self.chats }
}
}
class ChatsViewController {
var getChats: (() -> ([String]))!
func doSomethingWithChats() {
let chats = getChats()
// use it as needed
}
}
그런 다음 Account 클래스 내에서 원하는만큼 배열을 수정할 수 있습니다. 뷰 컨트롤러 클래스에서 배열을 수정하려는 경우에는 도움이되지 않습니다.
사용 inout은 하나의 해결책이지만 배열이 값 유형이기 때문에 나에게 매우 신속하게 느껴지지 않습니다. 스타일 적으로 저는 개인적으로 변형 된 사본을 반환하는 것을 선호합니다.
func doSomething(to arr: [Int]) -> [Int] {
var arr = arr
arr.append(3) // or likely some more complex operation
return arr
}
var ids = [1, 2]
ids = doSomething(to: ids)
print(ids) // [1,2,3]
inout그것이 배터리를 절약하기 때문에 보편적으로 더 좋다고 제안했다고 생각 했습니다. 이 솔루션의 가독성, 불변성 및 스레드 안전성이 보편적으로 더 우수하며 사용 사례에서 보장하는 드문 경우에만 최적화로 사용해야한다고 말하고 싶습니다.
account전역 변수를 만들고 as : 의chats속성을 정의했습니다 .ChatsViewControllervar chats: [Chat] { return account.chats }