2015-01-06 1 views
0

난과 같이 할 수 임시 값을 사용하지 않고 2 개 객체를 교환하려고했는데 :Swift 런타임은 튜플을 어떻게 처리합니까?

var a = "Hello, " 
var b = "world!" 

(a,b) = (b,a) 

a // "world!" 
b // "Hello, " 

사람이 언어가이 일을하는 방법을 알고 있나요을, 두 번째 튜플 (B, A) 저장 메모리에서 첫 번째가 스스로를 재 할당 할 수 있도록하거나, 참조를 변경하여 모든 작업을 수행합니까? 사전에

감사

+1

그것은 안전하고 안정적으로 그래서 당신이 무슨 상관입니까? 정말로 걱정된다면,'swap' 전역 함수를 사용하십시오. 하지만 튜플 스왑에 아무런 문제가 없었습니다. 그것은 루비와 같습니다. – matt

+0

** ** '문자열'과 같은 값 유형에 대한 참조를 전환하지 않습니다 **. – akashivskyy

+1

스위치를 추가하기 전에'NSLog ("% p % p", a, b)'** ** 전후에 **를 추가하여 이것을 확인할 수 있습니다. – akashivskyy

답변

0

"전환"은 다음을 이런 종류 :

    • 클래스 형에 대한 포인터를 대체

      var classA = NSString(string: "foo") 
      var classB = NSString(string: "bar") 
      
      NSLog("%p %p", classA, classB) // 0x7fecd351def0 0x7fecd341cc30 
      (classA, classB) = (classB, classA) 
      NSLog("%p %p", classA, classB) // 0x7fecd341cc30 0x7fecd351def0 
      
    • 새로운 작성 에 대한 값 (사본) 값 형식

      var valueA = "baz" 
      var valueB = "qux" 
      
      NSLog("%p %p", valueA, valueB) // 0x7fecd34201b0 0x7fecd34211e0 
      (valueA, valueB) = (valueB, valueA) 
      NSLog("%p %p", valueA, valueB) // 0x7fecd351c880 0x7fecd351de90 
      
  • +0

    논리 레벨에서 완전히 옳았지만 문자열은 부분적으로 copy-on-write 기능을 가진 참조 유형과 비슷하며 컴파일러는 실제로 "정확하게"질문에 대한 대답을 최적화 할 수 있습니다 이것은 무엇을 할 것인가는 많은 것들에 달려 있습니다. "(또한 로깅은 컴파일러가 아마도 최적화 된 작업을 수행해야하므로 변경 될 수 있습니다 - 예를 들어 원래의 code,'b'의 값은 사실'a'와 vv에 똑바로 놓이게됩니다.) –

    +0

    예, 확실한 것은 그것이 단지 이론 일뿐입니다. 추신 당신의 블로그를 사랑해! :) – akashivskyy

    관련 문제