[swift]기본문법 typescript와 비교해서 생각해보기


1️⃣ typescript와 비슷한 것들

(1) 타입명시, 오버로드

// swift
func sum(a: Int, b: Int) -> Int {
    return a + b
}

func sum(a: Double, b: Double) -> Double {
    return a + b
}
// typescript
function sum(a: number, b: number): number {
  return a + b;
}
  • 변수에 타입을 명시하는 방법이 typescript와 매우 유사합니다.
  • 추가적으로 오버로드까지도 가능합니다.
sum(a: 2, b: 3)
  • 함수에 인자를 넣을때 지정해준 매개변수의 이름을 명시해줘야 합니다. (인자를 잘못 넣는 실수가 줄어들듯)
func sum(_ a: Int, _ b: Int) -> Int {
    return a + b
}

sum(3, 4)
  • 인자를 대입할때 이름을 명시해주기 싫다면 매개변수앞에 _를 붙여주면 됩니다.

(2) 타입추론

var a = 3;
a = 4;
a = "hello" // 컴파일 에러
  • 처음에 초기화해준 으로 타입을 추론합니다.
  • 이후에 다른 타입을 대입하면 컴파일 에러가 일어납니다.
  • swift에서 letvar자바스크립트에서 각각 constlet키워드와 비슷합니다. swift에서 var호이스팅(hoisting)이나 중복선언등등으로 부터 안전한듯 합니다. postDB playground에서는 호이스팅이 되지만 swift파일에서 작성했을때는 다음과 같은 에러를 출력해 주었습니다.
var a;  // 컴파일 에러
a = 4;
  • typescript에서는 위와 같이 선언시 any타입으로 명시되지만 swift에서는 초기화를 하거나 타입을 명시해줘야 합니다.
var Numbers: [Int] = [2, 4, 6, 8]
var Numbers2: Array<Int> = [2, 4, 6, 8]
var Numbers3 = Array<Int>() // 타입추론
var someSet: Set<Int> = [1, 2, 3, 1, 3, 2]
var someSet2: = Set<Int>()
  • 배열과 같은 컬렉션 타입의 경우 위와같은 방법으로 명시해줄 수 있습니다.

(3) 옵셔널

// swift
var name: String?
// typescript
let name: string | undefined;
  • swift에서는 ?가 붙으면 옵셔널로 선언해줄 수 있습니다. nil 혹은 String타입임을 명시합니다.
  • typescript로 표현해본다면 위와같이 만들 수 있을 것 같습니다.
// swift
let num = Int("10")
  • 위와 같이 런타임중에 타입이 정해지는 경우 num의 타입은 Int?와 같이 옵셔널타입으로 적용됩니다.
// swift
let num = Int("10")
print(num) // Optional(10)
print(num!) // 10
print(num! as Int) // 10
  • 옵셔널변수 뒤에 !를 붙여 nil이 아님을 확신하는 방법이 있습니다.
// typescript
let a: string;
function temp(b: string | undefined) {
  a = b!;
  a = b! as string;
}
  • typescript에서 쓰임과 비슷합니다.
// swift
let randomFruit: String? = nil
let myFruit: String = randomFruit ?? "Apple"
print(myFruit) // "Apple"
  • 위와 같이 nil값일 경우 default값을 설정해줄 수 있습니다.
// swift
func temp(a:Int = 3) {
    print(a)
}
temp() // 3
  • typescript와 같이 함수의 매개변수에도 default값을 설정해줄 수 있습니다.

2️⃣ typescript와 다른 것들

(1) 범위

let sampleArray = [1, 2, 3, 4, 5, 6, 7]
print(sampleArray[0...3])  // [1, 2, 3, 4]
print(sampleArray[0..<3])  // [1, 2, 3]

for x in 1...5 {
    print(x)  // 1 2 3 4 5
}
  • swift에서는 위와같이 간단하게 범위를 설정해줄 수 있습니다.

(2) switch문

let sample = 12;

switch sample {
	case 1:
		print("1")
	case 2...9:
		print("2 ~ 9")
	case 10:
		print("10")
	case 11, 12, 13:
		print("11 or 12 or 13")
	default:
		print("nothing")
}
  • 범위값으로 case를 설정해줄 수 있습니다.
  • , 로 여러게 값을 case값으로 넣어줄 수 있습니다.
func printCoordinate(coordinate:(x: Int, y: Int)) {
	switch coordinate {
		case (0, 0):
			print("원점")
		case (0, _):
			print("y축")
		case (_, 0):
			print("x축")
		default:
			print("어느축에도 속하지 않는 좌표")
	}
}
let a = (x: 2, y: 0)
printCoordinate(coordinate: a) // x축
  • 튜플(tuple)을 위와같은 방법으로 switch문에 적용해볼 수 있습니다.
  • break명령어를 쓸필요없습니다. fallthrough를 작성해준다면 다음 케이스로 넘어가짐
func printCoordinate(coordinate:(x: Int, y: Int)) {
    switch coordinate {
        case (let x, 0) where x > 3:
            print("x좌표가 3보다 큰 \(x)이네요")
        case (0, let y) where y < 5:
            print("y좌표가 5보다 작은 \(y)이네요")
        case (let x, let y) where x == y:
            print("x축과 y축은 같은 값이네요")
        case (let x, let y):
            print("x축: \(x), y축: \(y)")
    }
}
printCoordinate(coordinate: (x: 4, y: 0))  // x좌표가 3보다 큰 4이네요
printCoordinate(coordinate: (x: 4, y: 4))  // x축과 y축은 같은 값이네요
printCoordinate(coordinate: (x: 5, y: 7))  // x축: 5, y축: 7
  • let키워드로 변수를 받아 사용할 수 있습니다.
  • where을 이용하면 변수값을 검사할 수 있습니다.

(3) 기타

  • swift에서는 Array뿐만 아니라 Set, dictionary와 같이 파이썬에서 지원해주는 문법가지도 지원해줍니다.
  • swift언어는 ios개발 언어로 보통 xcode를 이용해서 개발을 합니다. 기존에 vscode를 많이 애용했었는데 컴파일 속도나 노트북발열(xcode시뮬레이터영향일수도..), vscode만의 마켓이용 불가등등 xcode가 불편한 점이 많습니다.
  • 하지만 위에서 간단히 살펴보았던 것 처럼 swift는 대부분의 언어의 좋은 기능들을 합쳐놓은 느낌이 들었습니다.
  • 비동기처리도 가능하다는데 앞으로 swift언어를 공부해가면서 알아봐야 겠습니다.




© 2021.02. by kirim

Powered by kkrim