[Swift] 기초 문법(1)

simoniful·2021년 10월 14일
0

Swift

목록 보기
3/9
post-thumbnail

Type Inference(타입 추론)

let number1: Int = 123 // 명시적인 적시: 타입 어노테이션
let number2 = 123 // 암시적인 인지: 타입 추론 

컴파일로 수행에 있어서 더 빠른 속도를 보장하기에 타입 어노테이션을 통한 적시를 지향해야합니다. 하지만, 여러개의 변수를 선언하고 할당하면서 코드를 작성하는 데 있어서 번거로움이 있기에 초기값 할당을 통한 추론도 상황에 맞게 활용하는 것이 필요합니다.


Type Conversion(타입 변환)

Swift는 Type-Safe한 언어이기에 한 번 정해진 타입을 변환하기 위해서는 특정한 문법을 활용하여 이를 변환해야 합니다.

숫자에서 문자열 변환

let num: Int = 123 
nubmer = "123" // Compile ERROR

// 문자열 타입의 생성자 사용
let numToStr: String = .init(num) 
// CustomStringConvertible 프로토콜을 사용
// iOS 8.0+, Swift Standard Library에 포함
let numToStr2: String = 123.description 
// String Interpolation 사용
let numToStr3: String = "\(num)"

문자에서 숫자로 변환

// 정수 타입의 생성자 사용 
let str = "123"
let number: Int = .init(str) // Compile ERROR, Int? 옵셔널 값 반환 - 래핑 필요
str = "abc"
let number: Int = .init(str) // Compile ERROR

Swift에서 문자열은 아스키가 아닌 유니코드입니다. 정수로 변환에 실패할 수 있기 때문에 Int?을 반환합니다.

Int(" 100")                       // Includes whitespace
Int("21-50")                      // Invalid format
Int("ff6600")                     // Characters out of bounds
Int("10000000000000000000000000") // Out of range
// 모두 nil 값 반환

따라서 숫자를 문자열로 바꾸는 것에 비해 좀 더 안전한 방법이 필요합니다. 옵셔널로 받은 값에 대한 언래핑 처리를 통하여 올바른 입력을 유도하고 nil 값 등 예외처리를 통해서 로직을 구성해야합니다.


Type Alias(타입 별칭)

함수를 보는 것 만으로도 해당 함수는 어떤 것을 통해서 어떤 로직을 실행하여 결과를 만들내는지 이해할 수 있어야합니다. 이러한 가독성을 높이기 위한 방책으로 데이터 타입에 특별한 이름과 형식을 부여하여 해당 의미를 더욱 명확히 하는 별칭을 설정하여 사용합니다.

"안녕하세요!".forEach { char in
  print("\(char)-\(char)")
}
// element 순회 

char: String.Element
typealias Element = Character
func CLLocationCoordinate2DMake(_ latitude: CLLocationDegrees, 
                              _ longitude: CLLocationDegrees) -> CLLocationCoordinate2D
// 함수 선언에서 매개변수 

latitude: CLLocationDegrees
longitude: CLLocationDegrees
typealias CLLocationDegrees = Double

Collection Type

공식 문서 사이트를 보면 웹에서 MDN처럼 관련 메서드를 명시해두었습니다.

Tuple

사실 tuple은 Swift의 Collection Type이 아닙니다.
여러가지 "타입"을 한꺼번에 묶어서 사용하기 위한 아주 간단한 Struct(구조체)입니다.
named type뿐만아니라, compound type도 모두 담는 것이 가능합니다.
하지만 Sequence라는 프로토콜을 준수하지 않기에 순회하는 것은 불가능합니다.
한번 선언되면 수정 삭제가 제한됩니다.

var tuple = (1, "Hello, world!", true)
var anotherTuple = (1, (tuple))

tuple.0 // 1
tuple.1 // "Hello, world!"
tuple.2 // true

anotherTuple.0 //1
anotherTuple.1.0 //1
anotherTuple.1.1 //"Hello, world!"
anotherTuple.1.2 //true

🔗 Swift ) tuple


UIStackView

UIStackView를 적용하면 오토 레이아웃 기능을 활용하여 일렬로 구성된 UI를 만들수 있습니다. Interface Builder에서 해당 요소에 대한 constrain을 적용하여 위치를 결정할 수 있으며, 해당 UIStackView의 각 공간의 영역 크기에 맞추어 콘텐츠를 구성하고 배열이 가능합니다. 웹 개발에서의 블럭 요소에 대한 레이아웃과 유사합니다.

  • 수평, 수직에 대한 방향
  • 수직적인 요소를 조절하는 alignment
  • 수평적인 요소를 조절하는 distribution
  • 콘텐츠 간 간격인 spacing

compression resistance / hugging priority

  • Hugging priority
    우선순위가 높으면 내 크기 유지. 우선순위 낮으면 크기 늘어남 (늘어난다 = 당겨진다 = 커진다)
  • Compression Resistance priority
    우선순위가 높으면 내 크기 유지. 우선순위 낮으면 크기 작아짐 (밀린다 = 찌그러진다 = 작아진다)

두 오브젝트 중 하나가 커져야하는 상황 -> Hugging priority
두 오브젝트 중 하나가 작아져야하는 상황 -> Resistance priority

🔗 StackView 톺아보기
🔗 Hugging priority와 Compression Resistance priority 비교

profile
소신있게 정진합니다.

0개의 댓글