[Swift] Cannot assign to property: 'self' is immutable

Posted by Space_Jin
2024. 5. 6. 17:32 Programming/iOS
728x90
반응형

Cannot assign to property: 'self' is immutable 문제 원인과 해결

위 문제는 구조체(Struct)안의 property를 함수를 통해서 변경하려고 할 때, 발견할 수 있다.

기본적으로 구조체는 스냅샷(snap shot)을 찍어내는 것이다.

struct Example {
	var p = 0
    
    func changeP() {
    	p += 1	//p를 1증가
    }
}

위 코드에서 p는 가변 변수로 정의했다. 하지만 해당 구조체는 변하지 않는 스냅샷이 되어야하기에 구조체 입장에서 불변이여야할 property p를 구조체 내부 함수에서 변경할 수 없다.

var ex1 = Example()

ex1.p = 1	//p값을 변경

위 처럼 Example을 상속받아 생성한 ex1객체는 p값을 직접 수정은 가능하지만, 디자인 패턴을 지키기 위해서 구조체 내부함수에서 변경하는 방법이 필요한 상황이 생긴다.

해결책 (mutating 키워드 사용)

struct Example {
	var p = 0
    
    mutating func changeP() {
    	p += 1	//p를 1증가
    }
}

내부 property를 변경하기 위해서 func 앞에 "mutating" 키워드를 작성하면 변경이 가능하다.

728x90
반응형

[Swift Tutorial] Swift UI Layout 안전 영역 / 화면 전체 채우기

Posted by Space_Jin
2023. 10. 8. 16:04 Programming/iOS
728x90
반응형

# Swift 여백 없애기 / 화면 전체 채우기

1. 제약 조건 추가하기

추가한 view를 선택 후 오른쪽 하단의 제약사항 버튼을 추가해서 view의 제약사항을 추가한다.

붉은 화살표로 표시되어있는 선을 클릭하여 다른 view와 상대적인 거리 제약을 만든다.

4면을 값을 입력하면 거리 제약을 만들 수 있다. (위 사진은 거리 제약을 0으로 만듦)

 

제약 사항을 추가한 모습

거리 제약을 0으로 했음에도 여백이 생긴 이유는 거리 제약이 상단의 노치가 스크롤 바가 포함되어있는 안전영역(Safe area)과 이뤄졌기 때문이다.

가로 회전 모습

파랜색 view를 전체 화면으로 채우기 위해서는 이러한 제약사항을 safe area가 아닌 전체 view로 맞춰주면 된다.

 

2. 제약 사항 객체 바꾸기

위 그림과 같이 왼쪽 view controller에서 constraints(제약사항)을 클릭하여 수정할 제약사항을 선택한다.

오른쪽 삼각자 모양의 Size inspector를 선택 후 Second item을 safe area에서 super view를 선택 후 제약사항 거리(constraint distance)가 0인것을 확인하거나 0으로 바꾸어준다.

4면의 제약사항을 모두 동일하게 바꿔주면 여백이 없이 view를 화면에 가득 채울 수 있다.

같은 방법으로 화면에 가득찬 배경을 만들 수 있다.

728x90
반응형

[Swift Tutorial] Swift 난수 생성, 배열 랜덤 접근

Posted by Space_Jin
2023. 10. 3. 19:45 Programming/iOS
728x90
반응형

Swift 난수 생성하기

Swift는 정수, 실수, 논리형 타입의 random 함수를 이용해서 난수를 생성할 수 있다.

//난수 생성
Int.random(in: 0...10)  //0~10 정수 랜덤(0, 10 포함)
Int.random(in: 0..<10)  //0~10 사이 정수 랜덤(0 포함, 10 미포함)

Float.random(in: 0...10)    //실수
Double.random(in: 0...10)   //실수
Bool.random()   //논리

정수와 실수의 경우 "in: 숫자 ... 숫자" 연사자를 통해서 생성할 난수의 범위를 지정할 수 있다.

 

1. ... 연산자

in: 이후 ... 연산자는 양 끝 숫자를 포함한다.

 

2. ..< 연산자

..< 연산자의 경우 시작 숫자는 포함, 끝 숫자는 포함하지 않는다.

 

3. 논리(Boolean) 타입

논리형의 경우 True / False만 존재하므로 범위를 지정하지 않는다.

 

배열 임의의 요소 가져오기

let alphabet = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
print("정수 랜덤 값을 이용 : " + alphabet[Int.random(in: 0...25)])
print("배열 랜덤함수를 이용 : " + alphabet.randomElement()!)

난수를 생성하여 배열의 임의의 요소를 가져올 수 있지만, 배열의 randomElement() 함수를 통해서 가져올 수도 있다.

코드 실행 결과

alphabet.randomElement()! 에서 !는 결과로 나오는 optional을  unrapping 하기 위해서 사용 

728x90
반응형

[Swift Tutorial] Swift print 문 안에 수식 및 변수 넣기

Posted by Space_Jin
2023. 10. 1. 13:06 Programming/iOS
728x90
반응형

Swift print문 문자열 안에 수식 및 변수 넣기

Swift의 경우, Java, JavaScript, python 문자열 사이에 + 를 이용하여 수식이나 변수를 삽입할 수 없다.

 

대신, 문자열 안에 \([수식 및 변수]) 처럼 역슬래쉬 괄호 안에 값이나 수식을 직접 넣어서 사용할 수 있다.

 

// 수식 직접 입력
print("1 + 1 = \(1+1)")
//변수 삽입
var result = 3
print("1 + 2 = \(result)")

결과

 

728x90
반응형

[Xcode] Xcode 15 playground 자동 실행 설정

Posted by Space_Jin
2023. 10. 1. 12:52 Programming/iOS
728x90
반응형

Xcode 15 버젼 playground 자동 실행

실행 버튼을 꾹 누른 상태에서 "Aoutomatically Run"을 선택해 준다.

"Manually Run"을 선택하면 실행 버튼을 눌러서 실행하는 수동식으로 변경 가능

728x90
반응형

[Swift Tutorial] Xcode UIImage imageLiteral / imageLiteralResourceName 사용 예시

Posted by Space_Jin
2023. 9. 29. 13:09 Programming/iOS
728x90
반응형

UIImageView 객체의 value를 할당하기 위한 imageLiteral / imageLiteralResourceName 사용 예시

1. Asset에 이미지 자산을 등록

다운로드하거나 가지고 있던 이미지 파일을 드래그 앤 드롭으로 Assets 디렉토리 하위에 넣습니다.

 

2. UIImageView 객체 준비

diceImageViewOne 이라는 이름의 UIImageView 객체가 생성 및 링크 연결된 모습

 

3. 객체의 속성과 값(value)를 할당

객체.속성 = 값

 

값을 할당하는 방법 2가지 

 

3-1 imageLiteral 사용

값(value)의 위치에 "#imageLiteral(" 까지 타이핑하면 imageLiteral이 자동완성 된다.

자동완성된 iamgeLiteral은 왼쪽 그림과 같이 이미지 아이콘으로 형성된다.

이미지 아이콘을 더블클릭하면 오른쪽 그림과 같이 Assets에 등록한 이미지 파일을 참조할 수 있다.

Assets의 "DiceSix" 이미지 파일을 선택해 할당한 모습

 

3-2 imageLiteralResouceName 사용

Xcode의 자동완성 기능을 통해 UIImage를 imageLiteralResouceName로 선택한 모습

하이라이트 되어있는 String 타입을 Assets 디렉토리 안에 있는 image 파일의 이름을 넣어주면 값을 할당할 수 있다.

오른쪽 그림은 Assets 디렉토리에 등록되어 있는 "DiceSix" 값을 할당한 모습

728x90
반응형

M1 CocoaPods install 오류 해결(ft. lottie-ios)

Posted by Space_Jin
2022. 3. 13. 22:36 Programming/iOS
728x90
반응형

You may have encountered a bug in the Ruby interpreter or extension libraries.  해결 방법

IOS를 공부하면서 CocoaPods를 이용해 lottie-ios를 설치하려는데 바로 위 같은 오류가 나왔다. 역시 오류 넘어 오류...

 

다행이 금방 해결 할 수 있었습니다.

발생한 버그

🥸 해결 방법

sudo arch -x86_64 gem install ffi
arch -x86_64 pod install

터미널로 Podfile이 있는 디렉토리로 이동하신 후 위 명령어를 차례로 입력해주시면 됩니다.

 

M1 환경과 기존의 루비로 이루어져있던 라이브러리의 호환성 문제였기에 아키텍쳐를 지정해서 설치해주면서 해결한 것 같다.

 

간단명료하게 해결법을 찾아 글을 작성해주신 doka님 감사합니다.

728x90
반응형