매개 변수에서 사용할 때?
클래스 또는 기본 유형을 함수로 전달할 때 매개 변수에 대한 함수의 변경 내용은 클래스 외부에 반영됩니다.으로 이은기로같것입다니은으본적것▁same▁thing▁the▁an와 기본적으로 같은 것입니다.inout
매개 변수가 수행되어야 합니다.
inout 매개 변수의 좋은 사용 사례는 무엇입니까?
inout
로컬 변수를 수정하면 전달된 매개 변수도 수정됩니다.이 값을 지정하지 않으면 전달된 매개 변수가 동일한 값으로 유지됩니다.을 사용할 때 .inout
값 유형을 사용하지 않습니다.
예:
import UIKit
var num1: Int = 1
var char1: Character = "a"
func changeNumber(var num: Int) {
num = 2
print(num) // 2
print(num1) // 1
}
changeNumber(num1)
func changeChar(inout char: Character) {
char = "b"
print(char) // b
print(char1) // b
}
changeChar(&char1)
좋은 사용 사례는 다음과 같습니다.swap
전달된 매개 변수를 수정하는 함수입니다.
Swift 3+ 참고: Swift 3부터,inout
키워드는 콜론 뒤와 형식 앞에 와야 합니다.예를 들어 Swift 3+는 이제 다음을 요구합니다.func changeChar(char: inout Character)
.
Apple 언어 참조: 선언 - In-Out 매개변수:
최적화를 위해 인수가 메모리의 물리적 주소에 저장된 값인 경우 함수 본체 내부와 외부 모두에서 동일한 메모리 위치가 사용됩니다.최적화된 동작을 참조 호출이라고 합니다. 복사 오버헤드를 제거하면서 복사 인 복사 모델의 모든 요구 사항을 충족합니다.복사인 복사와 참조 호출 간의 동작 차이에 의존하지 마십시오.
정도 큰 값 큰 유형)유형을 , 인수를 사용되는 에는 만약당예어정느큰로도으메이신사인고적값하모용리수유로있같고은함유가수반을유는하환형형을형구조큰예▁if▁then,▁that▁the만고(▁type▁return▁function▁(-▁is,약있▁type고사▁you▁a▁just▁function▁alwayssay함▁takes▁have하신당▁argument유가수)▁as▁the▁argument▁memory▁replace▁value,이느어도▁type▁caller▁a▁that 마지막으로 함수 반환이 항상 호출자 인수를 대체하기 위해 사용되는 경우,inout
연관된 함수 매개 변수로 선호합니다.
. 서 설명은 왜 가 아의예고보오십을 를 설명합니다. 여기서 설명은 우리가 왜 사용해야 하는지를 설명합니다.inout
일반 반환 형식 함수 위에 다음과 같이 표시됩니다.
struct MyStruct {
private var myInt: Int = 1
// ... lots and lots of stored properties
mutating func increaseMyInt() {
myInt += 1
}
}
/* call to function _copies_ argument to function property 'myHugeStruct' (copy 1)
function property is mutated
function returns a copy of mutated property to caller (copy 2) */
func myFunc(var myHugeStruct: MyStruct) -> MyStruct {
myHugeStruct.increaseMyInt()
return myHugeStruct
}
/* call-by-reference, no value copy overhead due to inout opimization */
func myFuncWithLessCopyOverhead(inout myHugeStruct: MyStruct) {
myHugeStruct.increaseMyInt()
}
var a = MyStruct()
a = myFunc(a) // copy, copy: overhead
myFuncWithLessCopyOverhead(&a) // call by reference: no memory reallocation
, 위예서에기---억문무니다시---inout
를 읽는 호출자 인수를 될 수 .&
함수 호출에서 인수 앞에 있음).다음은 이를 매우 깔끔하게 요약한 것입니다.
함수가 매개 변수의 값을 수정하도록 하고 함수 호출이 종료된 후에도 이러한 변경 사항이 계속 유지되도록 하려면 대신 해당 매개 변수를 in-out 매개 변수로 정의합니다.
Apple Language Guide: Functions - In-Out Parameters.
에대 자내용은한에 대한 하십시오.inout
메모리에서 되는지 ( 그리메이서실처방법는리되로제름에모리고)copy-in-copy-out
의 소지가
(추가 편집:추가 참고)
는 ---Lucas Huang을 를 시도합니다.inout
는 ---는 변수로 .inout
에서 하지 으로 경고됩니다.이는 권장되지 않으며 언어 참조에서 수행하지 않도록 명시적으로 경고합니다.
원래 인수를 현재 범위에서 사용할 수 있더라도 in-out 인수로 전달된 값에 액세스하지 마십시오.함수가 반환되면 원본에 대한 변경 내용이 복사본 값으로 덮어씁니다.참조별 호출 최적화 구현에 의존하여 변경사항을 덮어쓰지 않도록 해야 합니다.
이은 "오직"를 들어, "오직" 불변입니다. 예를 들어,print(...)
하지만 관례상 이와 같은 모든 접근은 피해야 합니다.
해설자의 요청에 따라 '인아웃 논쟁으로 넘어간 가치'로 우리가 정말 아무것도 해서는 안 되는 이유를 조명하기 위해 사례를 추가하겠습니다.
struct MyStruct {
var myStructsIntProperty: Int = 1
mutating func myNotVeryThoughtThroughInoutFunction (inout myInt: Int) {
myStructsIntProperty += 1
/* What happens here? 'myInt' inout parameter is passed to this
function by argument 'myStructsIntProperty' from _this_ instance
of the MyStruct structure. Hence, we're trying to increase the
value of the inout argument. Since the swift docs describe inout
as a "call by reference" type as well as a "copy-in-copy-out"
method, this behaviour is somewhat undefined (at least avoidable).
After the function has been called: will the value of
myStructsIntProperty have been increased by 1 or 2? (answer: 1) */
myInt += 1
}
func myInoutFunction (inout myInt: Int) {
myInt += 1
}
}
var a = MyStruct()
print(a.myStructsIntProperty) // 1
a.myInoutFunction(&a.myStructsIntProperty)
print(a.myStructsIntProperty) // 2
a.myNotVeryThoughtThroughInoutFunction(&a.myStructsIntProperty)
print(a.myStructsIntProperty) // 3 or 4? prints 3.
따라서 이 경우 인아웃은 참조가 아닌 복사-인-카피-아웃(copy-in-copy-out)으로 작동합니다.언어 참조 문서에서 다음 문장을 반복하여 요약합니다.
복사인 복사와 참조 호출 간의 동작 차이에 의존하지 마십시오.
함수 모수는 기본적으로 상수입니다.함수 매개 변수의 값을 해당 함수의 본문 내에서 변경하려고 하면 컴파일 시간 오류가 발생합니다.이는 실수로 매개 변수의 값을 변경할 수 없음을 의미합니다.함수가 매개 변수의 값을 수정하도록 하고 함수 호출이 종료된 후에도 이러한 변경 사항이 계속 유지되도록 하려면 대신 해당 매개 변수를 in-out 매개 변수로 정의합니다.
inout param: 전달 및 로컬 변수 값을 수정합니다.
func doubleInPlace(number: inout Int) {
number *= 2
print(number)
}
var myNum = 10 doubleInPlace(number: &myNum)
inout 매개 변수를 사용하면 값 유형 매개 변수의 데이터를 변경하고 함수 호출이 끝난 후에도 변경 사항을 그대로 유지할 수 있습니다.
클래스를 사용하는 경우 매개 변수가 클래스에 대한 참조이므로 클래스를 수정할 수 있습니다.그러나 매개 변수가 값 유형인 경우에는 작동하지 않습니다(https://docs.swift.org/swift-book/LanguageGuide/Functions.html - In-Out Parameters 섹션).
inout을 사용하는 한 가지 좋은 예는 다음과 같습니다(CGPoints에 대한 산술 정의).
func + (left: CGPoint, right: CGPoint) -> CGPoint {
return CGPoint(x: left.x + right.x, y: left.y + right.y)
}
func += (left: inout CGPoint, right: CGPoint) {
left = left + right
}
기본적으로 변수의 주소를 가지고 놀고 싶을 때 유용합니다. 데이터 구조 알고리즘에서 매우 유용합니다.
inout 파라미터 swift 4.0 Work에서 사용할 경우
class ViewController: UIViewController {
var total:Int = 100
override func viewDidLoad() {
super.viewDidLoad()
self.paramTotal(total1: &total)
}
func paramTotal(total1 :inout Int) {
total1 = 111
print("Total1 ==> \(total1)")
print("Total ==> \(total)")
}
}
언급URL : https://stackoverflow.com/questions/34486052/when-to-use-inout-parameters
'itsource' 카테고리의 다른 글
jquery - 동적으로 만든 단추에 대해 작동하지 않는 이벤트 클릭 (0) | 2023.09.14 |
---|---|
하나의 스키마를 다른 새 스키마(Oracle)로 가져오기 (0) | 2023.09.14 |
런타임 오류:이 이벤트 루프가 python에서 이미 실행되고 있습니다. (0) | 2023.09.04 |
C#에서 문자열의 새 줄을 잘라내는 가장 쉬운 방법은 무엇입니까? (0) | 2023.09.04 |
보기에서 CURRENT_ROLE 사용 (0) | 2023.09.04 |