답변:
Swift의 구조체는 값으로 전달되지만 inout
수정자를 사용 하여 배열을 수정할 수 있습니다 (아래 답변 참조). 클래스는 참조로 전달됩니다. Array
그리고 Dictionary
Swift에서는 구조체로 구현됩니다.
NSArray
있기 때문에 사용하지 않는 것이 좋습니다 NSArray
.
inout
Structs와 함께 사용하면 어떨까요?
함수 매개 변수 연산자의 경우 다음을 사용합니다.
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
속성을 정의했습니다 .ChatsViewController
var chats: [Chat] { return account.chats }