[Swift] 변수의 타입

수진·2024년 3월 9일

Swift

목록 보기
2/3
post-thumbnail

변수타입 확인

  • 컴파일 시점에 정해짐
  • [option] + click
    특정 변수의 데이터형을 알고 싶으면 변수 위에 [option] + click을 하면 타입을 알 수 있다.

형변환

  • 기본적으로 좌, 우 동일한 타입이어야 함
  • 생성자의 호출로 변환
  • Int, Unit, Float, Double, String, Bool
let label = "The width is "
let width = 94
let widthLabel = label + String(width) // String은 String의 생성자 호출, "The width is 94"
let height = Int("10") // 10
let sheight = Int("10.5") // nil
let dheight = Int(10.5) // 10

문자열로 변환

  • 문자열 안에 변수 값은 문자열로 변환하여 적용 : \n
let apples = 3
let appleSummary = "I have \(apples) apples"

배열

  • 대괄호([])를 이용하여 만든다
// 배열 선언
var list1: [Int] = [] // Int를 저장하는 빈 배열, 명시적
var list2: [Int]()    // Int를 저장하는 빈 배열, 암시적

var itemList = ["pen", "book', "bag"]
let first = itemList.first // itemList[0]
let last = itemList.last // itemList[-1]

first, last는 컴파일이 아니라 런타임에 실행 -> Optional

var x = [10, 10.5] // x의 타입은 [Double]
var y = [10, 10.5, "20.5"] // 타입 불일치로 자동 형변환 불가능 -> 에러처리
var z: [Any] = [10, 10.5, "20.5"] // z의 타입은 [Any], 상위 타입으로 모든 타입 가짐

딕셔너리

  • <key, value>로 값을 저장하는 구도
// 딕셔너리 선언
var dic1: [String: Int] = [:] // <문자열, >으로 저장하는 딕셔너리, 명시적
var dic2: [String: Int]() // <문자열, >으로 저장하는 딕셔너리, 암시적

var students = ["홍길동": 12345, "김영희": 23456] // 딕셔너리 초기화
students["김철수"] = 34567 // 딕셔너리에 요소 추가
let friend = students["cong"] // 에러, "cong"이 저장되어 있지 않기 때문

제어문(if, for, while)

  1. if
if (condition && condition1) {
}
if condition, condition1 {
}

위의 두개는 같은 의미

var x = 10
var y = 20

if (x == 10 && y == 20) { // 괄호를 없애고, &&를 콤마로 바꿔도 됨 but, 괄호는 조건문을 나타내므로 조건문 안에서 &&을 콤마로 바꾸는 건 안됨
    print("OK")
} else {
    print("error")
}

Swith

  • 정수 타입 값이나 동등 비교 연산 뿐만 아니라 어떤 종류의 데이터든 사용할 수 있음
  • swifth문은 case문의 조건과 일치할 때 case문 아래에 속한 코드를 실행하고 switch문을 빠져나옴. 이후에 나오는 case문은 자동으로 빠져나오기 때문에 코드 끝에 break 키워드를 명시하지 않아도 됨
let vegetable = "red pepper"
swith vegetable {
	case "celery":
    	let vegetableComment = "Add some raisins and make ants on a log."
    case "cucumber", "watercress": // 콤마로 케이스를 연결 가능
    	let vegetableComment = "That would make a good tea sandwich."
    case let x where x.hasSuffix("pepper"): // 조건절 가능, x의 접미사 비교
    	let vegetableComment = "Is it a spicy \(x)?"
    default:
    	let vegetableComment = "Everything tastes good in soup"
  • default가 없으면 case로 모든 도메인을 커버해야 함

for in range

  • range 객체
    let range = 0..<10 // 0 ~ 9
    let range = 0...10 // 0 ~ 10

for in 컨테이너

  • 컨테이너 객체(배열, 딕셔너리) 포함된 요소들을 순차적으로 가져옴
  • 딕셔너리는 순서 보장이 안됨
let variableNumbers = [
	"Prime": [2, 3, 5, 7, 11, 13],
    "Fibonacci": [1, 1, 2, 3, 5, 8],
    "Square": [1, 4, 9, 16, 25]
]

var largest = 0
for (kind, numbers) in variableNumbers { // (kind, numbers) 대신에 ( _, numbers)가 더 좋다
	for number in numbers {
    	if number > largest {
        	largest = number
        }
    }
}
print(largest)

while

  • do { } while 대신에 repeat { } while을 사용

함수

  • func 함수 선언
  • 매개변수의 이름과 분리해서 '->'를 사용해 타입 이름을 표기하면 함수 반환 값의 타입을 지정
func greet(name: String, day: String) -> String // 반환값이 없는 경우 -> 생략 또는 -> Void
{
	return "Hello \(name), today is \(day)."
}

greet(name: "Bob", day: "Tuesday") // 호출
greet(day: "Tuesday", name: "Bob") // 매개변수 순서가 바뀌면 에러, 파이썬과 다름
  • 전달 매개변수: 함수의 매개변수에서 호출 시 사용하는 매개변수
func greet(from name: String, today day: String) -> String {
	return "Hello \(name), today is \(day)."
}
print(greet(from: "Bob", today: "Tuesday")) // 전달 인자로 호출
print(greet(name: "Bob", day: "Tuesday")) // 매개변수로 호출, 에러
  • 전달 매개변수의 생략
func greet(from name: String, _ day: String) -> String {
	return "Hello \(name), today is \(day)."
}
print(greet(from: "Bob", "Tuesday")) // 두번째 전달 매개변수가 없다
print(greet(name: "Bob", day: "Tuesday")) // day 넣으면 에러
  • 배열 인자
    배열을 이용해서 여러 개의 값을 함수의 인자로 받을 수도 있음
// 가변 매개변수
func sumOf(numbers: Int...) -> Int {
	var sum = 0
    for number in numbers {
    	sum += number
    }
    return sum
}
print(sumOf())                     // 0
print(sumOf(numbers: 42, 597, 12)) // 651
// 배열로 한개의 매개변수 전달
func sumOf(numbers: [Int]) -> Int {
	var sum = 0
    for number in numbers {
    	sum += number
    }
    return sum
}
print(sumOf(numbers: [42, 597, 12])) // 651

위의 두개는 동일함

중첩 함수

  • 함수는 중첩해서 사용 가능
  • 중첩(Nested) 함수는 감싸고 있는 함수에서 변수에 접근할 수 있음
func returnFifteen() -> Int {
	var y = 10
    func add() {
    	y += 5
    }
    add()
    return y
}
returnFifteen()

함수도 최상위 타입(first class type)

  • 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체(상수, 변수 등)
  • 보통 함수에 매개변수로 넘기기, 수정하기, 변수에 대입하기와 같은 연산을 지원할 때 최상위 타입 객체
  • 어떤 함수가 다른 함수를 반환 값 형태로 반환할 수 있다는 것을 의미
func makeIncrementer() -> (Int) -> Int {
	func addOne(number: Int) -> Int {
    	return 1 + number
    }
    return addOne
}
var increment - makeIncrement() // 함수 포인터를 리턴받은 값을 increment에 대입
increment(7)
  • 함수도 매개변수로 받을 수 있음
func hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool {
	for item in list:
    	if condition(item) {
        	return true
        }
    }
    return false
}

func lessThanTen(number: Int) -> Bool {
	return number < 10
}

var numbers = [20, 19, 7, 12]
hasAnyMatches(list: numbers, condition: lessThanTen)

0개의 댓글