문제상황 BoxDecoration을 사용하여 카드형태의 인터뷰카드를 제작하였고, 이를 클릭시 각 인터뷰 카드의 고유한 ID에 해당하는 상세 인터뷰 스크린으로 넘어가야했다. 스크린이동에는 문제가 없었으나 계속 아래와 같은 메시지가 나와서 찜찜했다ㅠ 에러 메세지 원인 및 해결책 원인은 아주 명확히 위 캡쳐사진 맨밑줄 2줄에 설명되어있다. Material Widget 사용을 위해서는 Card, Dialog, Drawer, Scaffold와 같은 Material 위젯 자체를 포함하는 위젯을 사용해야했다. 하지만 내 최종리턴타입은 Container를 감싼 Padding이었고 이를 Card로 감싸주니 말끔하게 해결되었다!
문제상황 'OOOO'은 손상되었기때문에 열 수 없습니다. 해당 항목을 휴지통으로 이동해야 합니다. mac을 사용하는 유저라면 앱스토어에 등록되어 있지 않은 Unknown 개발자의 앱이나 프로그램을 다운로드했을때 쉽게 마주칠 수 있는 상황이다. (열어줘ㅠㅠㅠㅠ) 에러 메세지 원인 시스템이 해당 앱의 출처를 확인할 수 없는 경우에는 맥의 보안 기능인 Gatekeeper가 앱의 문제점을 발견했다고 판단하고, 실행 자체를 막아버리게 된다. 해결책 1. sudo spctl --master-disable 터미널을 실행한다 sudo spctl --master-disable 그대로 복붙한뒤 cmd + enter -> 개인정보 보호 및 보안(설정창으로 들어가도 된다) 아래처럼 모든 곳의 허용이 되어있고 대부분의 경우라면..
문제상황 초보자들이 Selenium을 활용한 크롤링 시 발생하는 대표적인 오류다. "Chrome의 버전이 115.0.5790.114이고, ChromeDriver의 버전이 114.0.5735.90인 것을 확인했습니다. 이 두 버전은 호환되지 않습니다." 에러문장을 번역하면 위의 한문장으로 요약가능했다. ChromeDriver가 현재 크롬 브라우저보다 버전이 낮아서 발생하는 문제다. 찾아보니 ChromeDriver 버전과 Chrome버전이 다를때 발생하는 유명한(?) 에러였고 ChromeDriver 버전과 Chrome버전이 같아야한다는 것만 알면 간단히 해결할 수 있는 에러였다. 에러메시지 해결책 우선 둘의 버전을 확인한뒤 둘의 버전이 불일치하는지부터 알아보자(만약 이게 아니라면 다른 해결방안을 모색하시길...
문제상황 문법적인 오류 없이 코드를 작성하고 스토리보드와 코드를 연결했음에도 불구하고, 앱이 실행 자체가 안되는 상황🥲 에러 메세지 this class is not key value coding-compliant for the key!!! 원인 에러메시지 그대로 해석하면 heightLabel을 코드에 담았다고 하지만, XCode는 heightLabel을 찾을 수 없다는 뜻 찾아본 결과 이는 IBOutlet을 지정한 프로퍼티가 해당 클래스와 연결되지 않았거나, 스토리보드 상에서는 해당 아웃렛을 삭제했지만 해당 클래스 파일에서 해당 IBOutlet을 삭제하지 않은 경우 발생가능 노란색 경고와 함께 ViewController does not have an outlet named heightLabel 이라고 쓰..
이중 원형 연결 리스트 원형 이중 연결 리스트란 각 노드가 두 개의 포인터를 가지며, next 포인터는 리스트에서 다음 노드를 가리키고, prev 포인터는 리스트에서 이전 노드를 가리키는 이중 연결리스트를 기반으로 한다. 여기에 추가해서, 마지막 노드의 next 포인터가 NULL을 가리키는게 아니라 (head포인터가 가리키는) 첫 번째 노드를 가리키며, 첫 번째 노드의 prev 포인터는 마지막 노드를 가리킴으로써 원형 구조를 만듭니다.(무한 싸이클 느낌ㅋㅋ) 이중 원형 연결 리스트의 장점 1. 노드를 삽입하거나 삭제하는 등의 작업이 리스트의 크기와 관계없이 상수 시간 O(1)으로 수행가능 why? 인접한 노드의 포인터만 업데이트해주면 됨 2. 데이터 정렬(sort) 가능 이중원형 연결리스트는 개인적으로 ..
이제는 문법은 지겹도록 봤기에 앱만들기에 집중하고 있어 제네릭문법은 간단하게 다루으나 핵심은 담겨있다..(아님말구☺️) 필요하면 그때 더 심화된 내용으로 포스팅~! INDEX 1. 제네릭 2. 제네릭 타입 3. 연관 타입 4. 마무리 1. 제네릭 문법 1-1. 제네릭 문법은 왜(why) 필요한가? // 정수 2개 var num1 = 10 var num2 = 20 // 두 숫자를 스왑(서로 교환)하는 함수의 정의 func swapTwoInts(_ a: inout Int, _ b: inout Int) { let tempA = a a = b b = tempA } // 위에서 정의한 함수의 실행 swapTwoInts(&num1, &num2) print(num1) print(num2) // 만약, Double을 ..
INDEX 1. 에러 처리가 필요한 이유 2. 에러 처리 방법 3. 예제를 통한 에러 처리 연습 4. rethrows 키워드 5. 생성자와 메서드에서 throw 6. 마무리 1. 에러 처리가 필요한 이유 에러의 종류는 2가지 1) 컴파일 에러: 스위프트 문법과 관련된 에러(컴파일러가 미리 알고 수정해야한다고 고맙게 알려줌) 2) 런타임 에러: 프로그램이 실행되는 동안 발생 런타임 에러 -> 크래시(별도의 알림 없이 앱이 강제로 종료됨) : 발생가능한 에러를 미리 처리해 두면, 강제종료되지 않음 (개발자가 처리해야만 하는 에러) 런타임 에러 처리가 왜 필요할까? - 앱이 실행하는 중간에 꺼질까? - 어떤 얘기치 못한 상황이 발생할 수 있음(보험 느낌으로 필요) - 우리가 구현한 기능이 100% 정확히 동작..
원형 연결 리스트(CircleLinkedList) : 단일 연결리스트와 거의 동일해 보이지만, 마지막 노드가 NULL이 아닌 첫 번째 노드(head가 가리키는 노드)를 가리킨다 단순 연결리스트와 원형 연결리스트 비교 원형연결리스트의 장점 단순 연결 리스트처럼 머리와 꼬리를 가리키는 포인터 변수(head포인터와 tail포인터)를 각각 두지 않아도, 하나의 포인터 변수만 있어도 머리 또는 꼬리에 노드 추가 가능 지금까지의 (더미노드 포함)단일 연결리스트에서는 head 포인터를 통하여 새로운 노드를 추가하는 방식이었음 이번에는 tail포인터만으로 머리와 꼬리 둘다에 노드를 추가해볼 것 꼬리를 가리키는 포인터 변수는 tail 머리를 가리키는 포인터 변수는 tail -> next tail포인터만을 사용하여 머리와..