애플 숏컷에서 딕셔너리 값을 바꾸면 원본을 수정하지 않는다

오토메이션 공용환경 소개에서 애플 숏컷 환경에서 글로벌 변수를 제공하지 않아 ‘Toolbox Pro for Shortcuts’라는 별도 앱을 통해 글로벌 변수를 사용한다고 소개했습니다. 글로벌 변수를 사용할 수 있게 되면서 숏컷 활용도가 크게 올라갔지만 여러 숏컷에서 사용하는 모든 글로벌 변수가 네임스페이스 구분 없이 한 공간에 나열되어 있어 어느 값들을 어느 앱에서 사용하는 것인지 구분하기 쉽지 않았습니다.

한동안은 글로벌 변수 네이밍 규칙을 사용했지만 한 숏컷에서 여러 글로벌 변수를 읽어와야 할 때 각 값마다 불러오고 할당하는 노드 두 개가 필요했기 때문에 코드가 길어져 읽기 어려웠습니다. 그러다가 숏컷의 ‘딕셔너리’ 데이터 타입을 글로벌 변수에 넣으면 이를 JSON 형식으로 저장한다는 것을 알게 되었습니다. 그러면 한 숏컷에서 사용하는 여러 글로벌 변수를 딕셔너리에 밀어 넣은 다음 글로벌 변수 하나에 기록해 네임스페이스를 구분하고 또 여러 값을 한번에 불러올 때 편하게 사용할 수 있을 것 같았습니다.

하지만 애플 숏컷에서 원본 딕셔너리를 만든 다음 그 딕셔너리에 값을 수정하고 수정된 원본 딕셔너리를 글로벌 변수에 기록하면 될 거라고 예상했는데 글로벌 변수에 기록된 JSON은 값을 수정하기 전 버전이었습니다. 저는 뭔가 기록이 제대로 되지 않는다고 생각했고 이유를 몰라 한참 헤맸는데 핵심은 애플 숏컷에서 딕셔너리를 수정하면 수정을 위해 인자로 전달한 원본 딕셔너리는 그대로 두고 값이 수정된 딕셔너리를 리턴한다는 것입니다. 그래서 값이 수정된 딕셔너리를 저장하려면 값을 수정한 다음 여기서 나온 새 딕셔너리를 사용해야 합니다.

그래프

결과

설명

그래프

결과

설명

 

딕셔너리에 태스크 이름, 태스크 키형식으로 값을 할당한 다음 딕셔너리를 원본이라는 변수에 할당했습니다.

예제용으로 만들었지만 이전에 소개한 오토메이션 사례의 실제 사용과 비슷합니다.

 

식세기, TODO-3221이라는 새 값을 딕셔너리에 추가했는데 이 때 원본딕셔너리가 수정되지 않아 Set Variable이 리턴한 새 딕셔너리를 사용해야 합니다.

바로 위에서 딕셔너리에 새 키를 추가한 다음 원본 딕셔너리를 찍어 보면 값이 추가되지 않은 상태입니다.

Set Variable이 리턴한 수정본 딕셔너리를 찍어 보면 값이 추가된 상태. 이 딕셔너리를 글로벌 변수에 기록해야 합니다.

이런 개념이 함수형 프로그래밍이라는 말씀을 들었는데 함수형 프로그래밍이라는 말만 들어 봤고 실제로 뭔지는 잘 몰랐습니다. 이 사례로 이해해보면 대략 함수처럼 인자를 주면 뭔가 동작을 한 결과를 돌려주는 형태로만 동작하는 걸 의미하는 것 같습니다. 이 관점에서는 함수가 결과를 돌려주는 방식 대신 인자로 넘긴 원본 딕셔너리를 직접 건드리는 방식으로 동작하는 건 어울리지 않는 것 같고요. 여튼 익숙하게 딕셔너리 주소를 전달해 원본 딕셔너리를 직접 수정할 거라고 예상한 덕분에 한참 삽질하고 말았습니다.