타 프로그래밍 언어와 마찬가지고 swift 언어 또한 클래스의 상속을 지원한다. 더이상 해당 클래스에서 하위 클래스로의 전체 클래스 또는 일부(메서드, 프로퍼티)가 상속에 따른 재정의가 될 필요가 없다고 판단한 경우 final키워드를 각 요소 앞에 추가함으로써 상속을 방지할 수 있다.
재정의할 필요가 없을때 사용
클래스 자체가 상속되는것을 막고싶을 때 사용 > final 클래스를 상속받으려는 클래스는 컴파일 시 에러가 발생함
이 밑의 개념은 아직 내가 잘 이해를 못한 것 같다.
이해가 되면 이해한 만큼 다시 정리해봐야할 것 같다….ㅠ
vtable
vtable은 가상 메서드 테이블을 이르는 것으로, 메서드 오버라이딩에 따라 실행 시점에 어떤 메서드를 실행할 지 결정하는 동적 디스패치를 지원하기 위해 프로그래밍 언어에서 사용하는 매커니즘이다.
final 키워드 적용이 성능에 미치는 영향
final로 선언된 요소들은 직접 호출
그렇지 않은 경우는 vtable을 통해 간접 호출
오버라이딩한 메서드는 실행 시점에 어떤 메서드를 실행할 지 결정하는 반면 final 키워드가 적용된 메서드는 컴파일 시점에 어떤 메서드를 실행할 지 결정할 수 있기 때문에 성능 상 이점을 가진다고 한다.
사실 개발환경에서는 에러 메시지가 영어로 나오는것이 훨씬 좋기때문에(검색에 용이…) 맥북 언어 설정 자체를 영어를 우선으로 두는게 좋다. 그럼에도 만약 한글을 사용하게 되어 혹시나 한글이 깨진다면 ⌘ + , -> profile -> text -> unicode -> form을 NFC로 변경을 하면 된다고 한다.
zsh, oh-my-zsh
// zsh 설치
brew install zsh
// oh-my-zsh 설치
sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
zsh 관련 설치
// zsh-autosuggestions > 터미널 입력 시 history 기반 단어를 추천
brew install zsh-autosuggestions
이렇게 설치를 하고나면 터미널을 나갔다 다시 들어와도 되고 source ~/.zshrc를 하면 설치한 내용들이 적용되어있는 것을 볼 수 있을 것이다.
Node.js 설치
brew install node
이외 설치해볼 것들
brew instlal google-chrome
brew install vlc
brew install atom
brew install slack
맥 시간 설정 안되어있을 경우
환경설정 > 날짜 및 시간 > 좌물쇠 풀고 > 시간대 설정 변경해주기
iterm 테마 꾸미기
플러그인 설치도 할 수 있지만 나는 이런거엔 관심이 별로 없기에..
환경설정 들어가서 바꿔주기
iterm 상태바 보여주기
iterm configuration 에 들어가서 profile > session > Status bar enabled 체크 > Configure Status Bar 선택해 원하는 항목 추가 저장하고 나와서 Appearance > Status bar location으로 상태바 위치 설정
맥북 대략적인 초기 기본 설정
mission control > Automatically rearrange Spaces based on most recent use > 체크 안함: 최근에 만진 화면 순서대로 미션 컨트롤 창 순서가 바뀌지 않도록 설정
언어는 무조건 영어가 우선순위 가 될 수 있도록 (선택사항이긴 함): locale 설정때문에 오류가 발생하는 걸 방지해주고 영어 오류 메시지가 구글 검색에 더 용이함
패스워드, 분실대비 스크린 메시지 설정, 디스크 암호화 등
Keyboard > text > 자동변경 옵션, 입력한 단어 변경 등 위에서부터 3개 다 체크 해제
Correct spelling automatically 체크 해제
Capitalize words automatically 체크 해제
Add period with double-space 체크 해제
Use smart quotes and dashes 반드시 해제해주기!
Keyboard > shortcut > Use Keyboard navigation to move focus between controls: 키보드로 예/아니오 설정할 수 있는건데 이건 선택사항임
TrickPad > tap to click 선택!: 트릭패드 꾹 안누르고 터치만으로 클릭 가능하게 하는것
Accessibility > Pointer Control > Trackpad options > Enable dragging > three finger drag: 세 손가락으로 드래그 가능하게 함 > 요건 신세계였음
근데 이 방법을 사용하면 원래 세 손가락으로 미션컨트롤 이동을 했는데, 이젠 네손가락으로 이동을 하게 됨(선택은 자유!)
finder preference > show all filename extensions 체크함: 모든 파일의 확장자를 보여줌
개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.
공부하면서 더 추가해나갈 예정입니다. 틀린 부분 혹은 잘못된 부분이 있다면 알려주세요! :)
AutoLayout
view의 절대적인 좌표가 아닌 상대적인 좌표를 요할 때 사용한다.
오토레이아웃이 없으면 view의 크기는 고유 크기를 지니고 있다. (width, height)
multiplier
연결하는 방식에 따라 비율이 달라진다.
1>2, 2>1로 연결하냐에 따라 First Item, Second Item 이 정해지고 비율이 설정된다.
alignmebt + multiplier
부모뷰를 기준으로 이동
하나만 선택했을때 가로, 세로 정렬을 선택할 수 있음
Horizontally in Container, Vertically in Container 설정
Align CenterX: 0.1 > 왼쪽으로 이동, 1.5 > 오른쪽으로 이동
Align CenterY: 0.1 > 위로 이동, 1.5 > 아래로 이동
View를 겹치게 하기
2개 이상의 겹쳐진 뷰를 만들 때 단순히 자식뷰의 multiplier 값을 변경하는 것으로 한다면 부모 view가 어떤 모양을 가지거나 라운드 처리를 해야하는 등의 view라면
inspector에서 clip to bounds 속성을 체크하게 된다. 이러면 부모뷰에서 겹쳐지지 않은 영역은 잘리게 된다. > 동등하지 않은 레벨의 정렬
view를 겹쳐지게 하기 위해서 자식 뷰를 부모 뷰에서 꺼내고 두 뷰를 선택한 뒤 Top Edges와 Horizontal Centers를 체크한다. > 동등한 레벨의 정렬
그리고 겹쳐질 뷰의 Align Center Y의 Second Item을 Center Y 로 변경한다.
Priority
priority는 우선 Required(1000), High(750), Low(250)이 기본이며 원하는 만큼의 값을 직접 입력할 수 있다.
일단 기본으로 1000priority가 주어지는데 이것은 강한 우선순위로 다른 우선순위에 영향을 준다.
Hugging: 내 컨텐츠에 대한 본연의 사이즈 유지 우선순위
Compression Resistance: 배치한 방향에 대한 우선순위 (작지않게 버티겠다)
우선순위가 크면 내 크기를 유지하고
우선순위가 작으면 내 크기를 작게한다
숫자가 높을수록 우선순위가 높고
낮은 우선 순위는 늘어나게 된다.
Portrait(세로), Landscape(가로)
constraints는 세로모드일때와 같이 동일하게 지정
Vary for Traits 메뉴를 통해 width/height 변경에 따라 적용 가능한 디바이스 확인 가능
constraints 기준이 될 기존에 지정한 view가 바뀌는게 아닌 constant value(상수값)만 업데이트
extensionQuizVC{overridefuncwillTransition(tonewCollection:UITraitCollection,withcoordinator:UIViewControllerTransitionCOordinator){super.willTransition(to:newCollection,with:coordinator)// 현재 방향을 설정(bool)letisPortrait=UIDevice.current.orientation.isPortrait// 세로일 경우 45, 가로일 경우 65로 높이를 바꿔줌lblTimer.snp.updateConstraints{makeinmake.height.equalTo(isPortrait?45:65)}// 글꼴 크기를 변경해줌 lblTimer.font=UIFont.systerFont(ofize:isPortrait?20:32,weight:.light)}}
RemakeConstraints
constant value만 변경되는 것이 아닌 기준이 될 view도 업데이트
기존에 존재하던 constraints는 삭제된다.
리스트 형식의 테이블 뷰를 사용할때 새로고침 버튼을 두는것보다는 테이블 뷰를 아래로 당김으로써 새로고침을 진행하는 것이 좋다고 한다.
실제로 우리가 많은 앱을 사용하다 보면 앱의 최 상단을 위에서 아래로 잡아당겼을 경우 새로고침이 되는 경우가 많음을 쉽게 떠올릴 수 있을 것이다.
@available(iOS6.0,*)openclassUIRefreshControl:UIControl{/* The designated initializer
* This initializes a UIRefreshControl with a default height and width.
* Once assigned to a UITableViewController, the frame of the control is managed automatically.
* When a user has pulled-to-refresh, the UIRefreshControl fires its UIControlEventValueChanged event.
*
*/publicinit()openvarisRefreshing:Bool{get}openvartintColor:UIColor!openvarattributedTitle:NSAttributedString?// May be used to indicate to the refreshControl that an external event has initiated the refresh action@available(iOS6.0,*)openfuncbeginRefreshing()// Must be explicitly called when the refreshing has completed@available(iOS6.0,*)openfuncendRefreshing()}
UIRefreshControl 내부를 살펴보면 iOS6.0 버전 이상부터 지원이 되고있으며 UIControl를 상속받고 있음을 볼 수 있다. isRefreshing 은 현재 리프레쉬가 진행중인지를 나타나며 tintColor 를 통해 색의 변화도 줄 수 있다. attributedTitle 를 통해 새로고침 indicator 아래에 다른 글귀를 줄 수도 있다
UIRefreshControl를 인스턴스화 하여 target 설정을 해주면 스와이프 액션이 취해졌을 때, 연결해놓은 updateTableView 함수를 호출합니다.
updateTableView함수가 호출되면 리프레쉬를 종료하는 endRefreshing 함수를 호출함으로써
initRefresh 함수는 종료하며 tableView는 reloadData를 하게 됩니다.