Swift - 값 유형과 참조 유형에 대한 초기 탐구

6152 단어 iOS고급 승급

전언


swift의 구조체와 클래스는 구성과 기능에 있어 일정한 유사성을 가지고 둘 다 구성원 속성을 포함할 수 있으며 구성원 방법은 데이터 저장과 기능성 모듈 봉인에 사용된다.종종 양자를 어떻게 구분하고 사용해야 할지 모르게 된다

값 유형 개념 및 참조 유형 개념


값 유형의 개념: 값 유형은 시스템이 표준적인 복제를 한 후에 복제된 대상과 복제된 대상 사이에 아무런 관계가 없고 서로 절대적인 독립을 가지며 이 유형의 데이터를 값 유형이라고 부른다(OC의 깊은 복사와 같다)
인용 유형의 개념: 인용 유형은 시스템이 표준 복제를 한 후에 복제된 대상과 복제된 대상 사이에 밑바닥의 공유 관계를 가진다는 것을 말한다. 즉, 이들의 공용은 같은 밑바닥 자원이다.이 유형을 인용 유형이라고 부른다

값 유형과 인용 유형의 근본적인 차이는 저장 영역의 차이에 있다


swift의 데이터 저장은 창고 구역과 창고 구역, 창고 구역 저장 값 유형, 창고 구역 저장 사용자 정의 유형과 값 유형 데이터와 코드로 나뉜다.여기서 우리는 OC의 한 예가 다음과 같기 때문이다.
/* */
@interface SomeClass : NSObject 
@property int number;
@end
@implementation SomeClass
@end

/* */
struct SomeStruct {
    int number;
};


SomeClass *reference = [[SomeClass alloc] init];
reference.number = 42;
SomeClass *reference2 = reference;
reference.number = 43;
NSLog(@"The number in reference2 is %d", reference2.number);
The number in reference2 is 43



struct SomeStruct value = {};
value.number = 42;
struct SomeStruct value2 = value;
value.number = 43;
NSLog(@"The number in value2 is %d", value2.number);
The number in value2 is 42

상기 결과의 차이는 주로 저장 변수나 대상의 공간 구역이 다르기 때문이다.Class 클래스는 먼저 alloc init 방법을 통해 메모리 공간에 실례 속성과 코드를 저장합니다.그리고 창설된 실례 인용 값을 변수 형식에 저장해서 인용을 통과할 때 창고의 인용 주소 구역 더미를 통해 실례 대상의 내용을 찾습니다.따라서 값의 인용은 밑바닥에서 수정됩니다.
구조체 클래스는 값 인용 유형으로 창고나 창고에 저장할 수 있다. 창고나 창고에 저장될 때 되돌아오는 것은 모두 데이터 내용 자체이다. 데이터 자체에 대한 부수값, 즉 그 밑바닥에 데이터를 부수함으로써 그 결과는 독립된 데이터를 생성하는 것이다.

값 유형과 참조 유형의 중첩


값 유형 중첩 값 유형: 값 유형의 중첩은 저장 영역을 확대하고 내부 값은 외부 값의 일부분으로 새로운 값 유형을 생성합니다
struct baseStruct {
    var number:Int = 10
    var numDes:String = "baseStruct"
}

/* */
struct numberStruct {
    var base:baseStruct!
    var number:Int = 20
}

let num:numberStruct = numberStruct(base: baseStruct(number: 10, numDes: "baseStruct"), number: 20)
 print("num.num:\(num.number), num.base.name:\(num.base.number)")
        
        
 var num1:numberStruct = num
 num1.number = 200
 num1.base.number = 100
 print("num1.num:\(num1.number), num1.base.name:\(num1.base.number)")

 print("num.num:\(num.number), num.base.name:\(num.base.number)")

 
num.num:20, num.base.name:10
num1.num:200, num1.base.name:100
num.num:20, num.base.name:10

인용 형식 플러그인 인용 형식: 인용 형식의 플러그인은 새로운 인용 형식으로 이해할 수 있습니다
class baseClass {
    var number:Int = 10
    var numDes:String = "baseStruct"
}

struct baseStruct {
    var number:Int = 10
    var numDes:String = "baseStruct"
}

class Student {
    var baseCl:baseClass = baseClass.init()
    var baseStru:baseStruct = baseStruct.init()
    func printDes() -> Void {
        print("baseCL\(self.baseCl.number, self.baseCl.numDes) baseStru:\(self.baseStru.number, self.baseStru.numDes)")
    }
}

let stu1:Student = Student.init()
stu1.baseCl.number = 10
stu1.baseCl.numDes = "baseClass"
stu1.baseStru.number = 20
stu1.baseStru.numDes = "baseStruct"
stu1.printDes()


let stu2:Student = stu1
stu2.baseCl.number = 100
stu2.baseCl.numDes = "baseClass*10"
stu2.baseStru.number = 200
stu2.baseStru.numDes = "baseStruct*10"
stu2.printDes()

stu1.printDes()
baseCL(10, "baseClass") baseStru:(20, "baseStruct")
baseCL(100, "baseClass*10") baseStru:(200, "baseStruct*10")
baseCL(100, "baseClass*10") baseStru:(200, "baseStruct*10")

인용 형식 플러그인 값 형식: 인용 형식 플러그인 값 형식 새로운 인용 형식 생성
class baseClass {
    var number:Int = 10
    var numDes:String = "baseStruct"
}

struct baseStruct {
    var number:Int = 10
    var numDes:String = "baseStruct"
}

class Student {
    var baseCl:baseClass = baseClass.init()
    var baseStru:baseStruct = baseStruct.init()
    func printDes() -> Void {
        print("baseCL\(self.baseCl.number, self.baseCl.numDes) baseStru:\(self.baseStru.number, self.baseStru.numDes)")
    }
}

let stu1:Student = Student.init()
stu1.baseCl.number = 10
stu1.baseCl.numDes = "baseClass"
stu1.baseStru.number = 20
stu1.baseStru.numDes = "baseStruct"
stu1.printDes()


let stu2:Student = stu1
stu2.baseCl.number = 100
stu2.baseCl.numDes = "baseClass*10"
stu2.baseStru.number = 200
stu2.baseStru.numDes = "baseStruct*10"
stu2.printDes()

stu1.printDes()
baseCL(10, "baseClass") baseStru:(20, "baseStruct")
baseCL(100, "baseClass*10") baseStru:(200, "baseStruct*10")
baseCL(100, "baseClass*10") baseStru:(200, "baseStruct*10")

값 형식 플러그인 인용 형식: 값 형식 플러그인 인용 형식은 상황이 좀 복잡합니다. 그가 만든 대상 형식은 변이한 값 형식입니다.값 유형의 비참조 유형은 새 복제본을 생성하고 참조 유형은 참조 유형의 복제 규칙을 따릅니다.총괄적으로 말하면 변이한 값 유형은 여전히 최신 복사 복사본을 만들어 낼 수 있지만 인용 속성이 있을 때 복사하는 인용 속성은 단지 인용 포인터일 뿐 인용 내용이 아니다
struct baseStruct {
    var number:Int = 10
    var numDes:String = "baseStruct"
}

class baseClass {
    var number:Int = 10
    var numDes:String = "baseStruct"
}

/* */
struct numberStruct {
    var base:baseStruct!
    var number:Int = 20
}


class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        /* */
        var stu1:numberExample = numberExample.init()
        stu1.baseCl.number = 10
        stu1.baseCl.numDes = "baseClass"
        stu1.baseStru.number = 20
        stu1.baseStru.numDes = "baseStruct"
        stu1.printDes()
        
        
        var stu2:numberExample = stu1
        stu2.baseCl.number = 100
        stu2.baseCl.numDes = "baseClass*10"
        stu2.baseStru.number = 200
        stu2.baseStru.numDes = "baseStruct*10"
        stu2.printDes()
        
        stu1.printDes()
        

    }


baseCL(10, "baseClass") baseStru:(20, "baseStruct")
baseCL(100, "baseClass*10") baseStru:(200, "baseStruct*10")
baseCL(100, "baseClass*10") baseStru:(20, "baseStruct")




결론: swift에서 언제 하나의 값 유형을 복사하든지 간에 새로운 복사본이 생기고 인용 유형을 복사하면 새로운 인용이 생기며 그 밑바닥에는 아무런 변화도 일어나지 않는다.

좋은 웹페이지 즐겨찾기