source

빠른 패스 바이 값 또는 패스 바이 레퍼런스

nicesource 2023. 5. 24. 22:12
반응형

빠른 패스 바이 값 또는 패스 바이 레퍼런스

저는 Swift가 정말 처음이고 수업이 레퍼런스로 전달되고 어레이/스트링 등이 복사된다는 것을 방금 읽었습니다.

참조 기준 통과는 실제로 "a" 참조를 통과하는 목표-C 또는 Java와 같은 방식입니까? 아니면 참조 기준 통과가 적절한 것입니까?

스위프트의 사물 유형

규칙은 다음과 같습니다.

  • 클래스 인스턴스는 참조 유형입니다(, 클래스 인스턴스에 대한 참조가 사실상 포인터임).

  • 함수는 참조 유형입니다.

  • 다른 모든 것은 유형입니다. "다른 모든 것"은 단순히 구조체의 인스턴스와 열거형의 인스턴스를 의미합니다. Swift에는 이것이 전부이기 때문입니다.예를 들어 배열과 문자열은 구조체 인스턴스입니다.다음을 사용하여 (함수 인수로) 이러한 것 중 하나에 대한 참조를 전달할 수 있습니다.inout그리고 새로운 법이 지적했듯이 주소를 가져가는 것.그러나 유형 자체는 값 유형입니다.

참조 유형의 의미

참조 유형 개체는 실제로 다음과 같은 이유로 특수합니다.

  • 단순히 할당하거나 함수에 전달하는 것만으로도 동일한 개체에 대한 여러 참조를 생성할 수 있습니다.

  • 참조가 물數, 참數, 상數, 조數, 수數, 가數, 체數, 한數, 체數, 자數, 는, 것數, 에數, 대數, 그數, ▁the數,let명시적 또는 암시적).

  • 개체에 대한 변환은 개체에 대한 모든 참조에서 볼 수 있듯이 개체에 영향을 줍니다.

그것들은 위험할 수 있으니 주의하세요.반면에 참조 유형을 전달하는 것은 포인터만 복사하여 전달하기 때문에 효율적이며, 이는 사소한 것입니다.

가치 유형의 의미

값것은 "더 안전하다이고, 분히유, 값을안전것하이는 "전며하달",let입니다. 는 " " ": " " " 를 통해 수 .let언급. 을 따로 것으로 것이 반면에, 그 안전성은 가치의 복사본을 따로 만드는 것으로 달성되는 것이 아닌가요?그러면 가치 유형을 전달하는 데 잠재적으로 비용이 많이 들지 않습니까?

음, 예, 아니오.그것은 당신이 생각하는 것만큼 나쁘지 않습니다.네이트 쿡이 말했듯이, 값 유형을 전달하는 것이 반드시 복사를 의미하는 것은 아닙니다, 왜냐하면let(묵시적이거나 암시적인) 불변성을 보장하므로 어떤 것도 복사할 필요가 없습니다.그리고 심지어는 a로 지나가는 것도.var참조는 사물이 복사된다는 것을 의미하는 것이 아니라 필요한 경우에만(돌연변이가 있기 때문에) 복사될 수 있다는 것을 의미합니다.의사들은 특별히 당신에게 당신의 바지를 비틀지 말라고 충고합니다.

Swift의 모든 항목은 기본적으로 "복사"에 의해 전달되므로 값 유형을 전달하면 값의 복사본이 제공되고 참조 유형을 전달하면 참조의 복사본이 제공됩니다.(즉, 참조 복사본은 여전히 원래 참조와 동일한 인스턴스를 가리킵니다.)

Swift는 많은 최적화를 수행하기 때문에 위의 "복사본" 주변에 공포 인용문을 사용합니다. 가능한 한 돌연변이가 있거나 돌연변이가 발생할 가능성이 있을 때까지 복사하지 않습니다.매개 변수는 기본적으로 변경할 수 없기 때문에 대부분의 경우 실제로 복사가 수행되지 않습니다.

매개 변수가 다음과 같을 때는 항상 값별로 전달됩니다.inout.

매개 변수가 다음과 같은 경우에는 항상 기준을 무시합니다.inout그러나, 이것은 당신이 명시적으로 사용할 필요가 있다는 사실 때문에 다소 복잡합니다.&전할때 할 때 inout변수를 직접 전달하는 기준별 전달의 전통적인 정의에 적합하지 않을 수 있습니다.

여기 참조로 전달할 수 있는 작은 코드 샘플이 있습니다.특별한 이유가 없는 한 이런 일은 피하세요.

func ComputeSomeValues(_ value1: inout String, _ value2: inout Int){
    value1 = "my great computation 1";
    value2 = 123456;
}

이렇게 불러주세요.

var val1: String = "";
var val2: Int = -1;
ComputeSomeValues(&val1, &val2);

Apple Swift Developer 블로그에는 이 주제에 대한 명확하고 자세한 토론을 제공하는 Value and Reference Types라는 게시물이 있습니다.

견적서 작성:

Swift의 유형은 두 가지 범주 중 하나로 분류됩니다. 첫째, "값 유형". 각 인스턴스는 일반적으로 구조, 열거 또는 튜플로 정의된 고유한 데이터 복사본을 유지합니다.두 번째 "참조 유형"은 인스턴스가 데이터의 단일 복사본을 공유하고 유형은 일반적으로 클래스로 정의됩니다.

Swift 블로그 게시물은 계속해서 예시와 함께 차이점을 설명하고 언제 다른 예를 사용할지 제안합니다.

+=와 같은 infix 연산자와 함께 inout을 사용하면 &address 기호가 무시될 수 있습니다.컴파일러가 참조로 전달한다고 가정하는 것 같은데요?

extension Dictionary {
    static func += (left: inout Dictionary, right: Dictionary) {
        for (key, value) in right {
            left[key] = value
        }
    }
}

origDictionary += 추가할 새 사전

그리고 이 사전 '추가'는 원래 참조에도 쓸 수 있으므로 잠금에 매우 적합합니다!

클래스 및 구조

구조와 클래스의 가장 중요한 차이점 중 하나는 구조가 코드에서 전달될 때 항상 복사되지만 클래스는 참조로 전달된다는 것입니다.

폐쇄

클래스 인스턴스의 속성에 폐쇄를 할당하고 해당 인스턴스 또는 해당 멤버를 참조하여 해당 인스턴스를 캡처하는 경우에는 폐쇄와 인스턴스 간에 강력한 참조 사이클이 생성됩니다.Swift는 캡처 목록을 사용하여 이러한 강력한 참조 주기를 중단합니다.

ARC(자동 기준 카운트)

참조 카운트는 클래스 인스턴스에만 적용됩니다.구조 및 열거형은 참조 유형이 아닌 값 유형이며 참조에 의해 저장 및 전달되지 않습니다.

클래스는 참조로 전달되고 다른 클래스는 기본값으로 전달됩니다.를 사용하여 참조로 전달할 수 있습니다.inout키워드

스위프트assign,pass그리고.return대한 참고치.reference type그리고 복사본으로Value Type

[값 대 기준 유형]

와 비교하면Java일치하는 항목을 찾을 수 있습니다.

  • Java 참조 유형(모든 개체)
  • Java 원시 유형(int, bool...) - Swift는 다음을 사용하여 확장합니다.struct

struct는 값 형식이므로 항상 값으로 전달됩니다.구조체를 생성합니다.

    //STEP 1 CREATE PROPERTIES
struct Person{
    var raw : String
    var name: String
    var age: Int
    var profession: String
    // STEP 2 CREATE FUNCTION
    func personInformation(){
        print("\(raw)")
        print("name : \(name)")
        print("age : \(age)")
        print("profession : \(profession)")
    }
}
//allow equal values
B = A then call the function
A.personInformation()
B.personInformation()
print(B.name)

B.name = "Zainab"과 같이 A의 값이 복사되므로 B에서 발생한 'B'의 값만 변경해도 B의 이름에 변경이 발생합니다.값 기준 전달

Pass By Reference Class Always Use pass by 점유된 메모리의 주소만 복사되는 참조로 패스 사용 B의 값을 명령 변경하는 것과 유사하게 변경하면 A와 B 모두 참조로 인해 변경됩니다.

언급URL : https://stackoverflow.com/questions/27364117/is-swift-pass-by-value-or-pass-by-reference

반응형