cell의 넓이는 고정값으로 줄 수 있지만 높이는 내용에 따라 동적으로 할당 받아야하는데 어떻게 해야할지 뒤적뒤적이다 UICollectionViewDelegateFlowLayout라는 protocol이 있다는 것을 발견 요놈을 활용해 동적 높이를 할당해보자 공식문서 UICollectionViewDelegateFlowLayout The methods that let you coordinate with a flow layout object to implement a grid-based layout. The methods of this protocol define the size of items and the spacing between items in the grid. 공식문서를 요약하면 이렇게 나온다. 즉..
이런 구닥다리 UI에서 나름 세련된 UI로 변경을 시도해봤다. 변경 적용사항 TextView에 입력한 내용은 즉각적으로 UI에 반영 통신을 하고 결과를 받기까지 user에게 통신중이라는 것을 알려줄 수 있는 indicator구현 1. input값을 먼저 반영하기 방법은 여러가지 겠지만, viewModel에서 callback함수를 통해 viewcontroller에게 상태를 전달하는 방식으로 구현했다. 그리고 DispatchQeue.main{ }로직을 전부 제거했다. 콜백 함수 정의 및 기존 메서드 수정 // viewModel var onMessagesUpdated: (() -> Void)? //기존 메서드 func processUserMessage(message content: String, model: ..
swift를 공부하면서 가장 어려운 부분이 ThreadSafe에 관한 부분이다. class MessageRepository { private var messagesStorage: [RequestMessageModel] = [] func addMessage(_ message: RequestMessageModel) { messagesStorage.append(message) } func getMessages() -> [RequestMessageModel] { return messagesStorage } func clearStorage() { messagesStorage.removeAll() } } 위 코드처럼 배열에 접근을 해서 data를 삭제했다 넣었다 확인했다 지지고 볶을때는 동시성의 문제가 발생 될 수..
고민한점🤔 1. 일자맵이라서 앞이 막혀 있다면 돌기만 하면된다.. 2. 일자맵 특성상 맨 마지막은 무조건 돌아야한다. 3. 돌때마다 포탈을 On / Off 시켜 맵에 있는 잼들을 전부 먹을 수 있게한다. let totalGems = randomNumberOfGems var gemCount = 0 while gemCount < totalGems { if isBlocked { turnLeft() turnLeft() bluePortal.isActive = !bluePortal.isActive pinkPortal.isActive = !pinkPortal.isActive } moveForward() if isOnGem { collectGem() gemCount += 1 } } 쉬웠다 ..
고민사항🤔 맵을 천천히 살펴보니 다음과 같은 결론을 얻을 수 있었다. 1. 블루포탈로 이동 2. 잼이 1개이상일 시 블루포탈 비활성화 3. 잼을 먹음 4. 잼이 2개라면 블루포탈 활성화 and 핑크포탈 비활성화 5. 잼이 3개라면 핑크포탈 활성화 pinkPortal.isActive = false var gemCount = 0 var switchCount = 0 func move() { if !isBlocked { moveForward() } else { turnLeft() } } func collect() { if isOnGem { collectGem() gemCount += 1 } } func potalHandler() { if gemCount == 1 { bluePortal.isActive = fal..
고민 🤔 1. while문의 실행 조건 > 보석을 수집할 때 동일한 수의 스위치를 작동시켜야한다. var gem = 0 //보석을 할당할 변수 var switchCount = 0 //스위치를 할당할 변수 두개의 변수에 할당된 정수가 같아질때까지 작동 2. 초기엔 둘 다 0임으로 while문에 || (or)연산자를 통해 추가 조건을 작성해준다 while gem == 0 || gem != switchCount { //여기에 움직임, 보석수집, 스위치 On코드 작성 } 3. 움직임에 대한 코드 작성 앞이 막혀있지 않다면 앞으로 직진 왼쪽이 막혀있다면 오른쪽으로 턴, 오른쪽이 막혀있다면 왼쪽으로 턴 func moveFlow() { if !isBlocked{ moveForward() } else if isBloc..
고민할 사항🤔 주어진 문제를 정리해보면 1. 보석은 3개만 수집되어야한다. 2. 스위치는 4개만 작동되어야한다. Flow 생각 1. 보석을 담은 변수와 , 스위치 카운터를 담은 변수가 있어야한다. var gemCounter = 0 var switchCounter = 0 2. 하나씩 추가하며 조건에 충족하면 더이상 보석을 수집하거나 스위치를 누르면 안된다. while gemCounter < 3 || switchCounter < 4 { //조건을 만족할때까지 실행될 코드 작성 } 3. 움직임 - 왼쪽이 막혀있지 않다면 왼쪽으로 돌기 - 오른쪽이 막혀있지 않다면 오른쪽으로 돌기 - 그 외의 경우에는 직진 func moveFlow() { if !isBlockedLeft { turnLeft() moveForwar..
Swift에서 프로퍼티, 인스턴스 메서드, 타입 메서드는 다음과 같은 의미를 가집니다 프로퍼티 (Properties): 프로퍼티는 클래스, 구조체, 또는 열거형과 같은 타입에 값을 저장하는 변수나 상수입니다. 이들은 인스턴스 프로퍼티와 타입 프로퍼티로 나뉩니다. 인스턴스 메서드 (Instance Methods): 특정 클래스, 구조체, 또는 열거형의 인스턴스에 속하는 메서드입니다. 이 메서드들은 특정 타입의 인스턴스에 대해 호출되며, 해당 인스턴스의 데이터에 접근하거나 수정하는 기능을 수행할 수 있습니다. 타입 메서드 (Type Methods): 타입 자체에 연결된 메서드입니다. static 키워드를 사용하여 선언하며, 클래스의 경우 class 키워드를 사용하여 재정의가 가능한 타입 메서드를 만들 수도 ..