Ruff! Ruff!
#2: CS50 track - lesson1 본문
*swift는 명령어 뒤에 end의 뜻으로 터미네이터(;) 사용 가능하지만 애플에선 권장하지 않음.
변수: let, var
let: 상수. 변경 불가능
var: 변수. 변경 가능
내장 데이터 타입: array, bool, dictionary, int, double, float, set, string
변수 선언
상수) let title: String = "cs50" -> let 변수명:(콜론) 변수타입 = 값
변수) var count = 50 -> var 변수명 = 값
조건문
if title == "ios" || title == "android" {
print("good choice")
}
else {
print("maybe next time")
}
* 조건에 (괄호) 사용 안 해도 됨.
* || -> or / && -> and
*format 지정자 사용가능.
배열선언
let values: [Int] = [1,2,3] //변수타입 생략 가능, 컴파일러가 배열값 확인해서 알아서 ~
for value in values { // for ~ in ~ 문법 사용 가능.
print(value)
}
딕셔너리
let airports: [String : String] = [ //key, value
"SFO": "San Francisco", //콤마로 각 쌍을 구분
"BOS": "Boston"
]
for (code, name) in airports { //code=key, name=value
print("\(code): \(name)") //문자열 보간*
}
*문자열 보간
- String interpolation
-문자열 내부에 변수 var를 배치하여 더 유용하게 만드는 기능
-문자열 안에 모든 유형의 변수를 넣을 수 있음.
- 백슬래쉬 \ 를 쓰고 괄호 () 안에 변수 이름을 입력 => \()
-문자열 보간 내부에 모든 종류의 데이터 배치 가능 (위에 나온 데이터 종류들 다 가능)
함수
func sayHello(name: String) -> String { //return값 String
let message = "Hello, \(name)"
print(message)
return message
}
sayHello(name: "Tommy") //매개변수 여러개면 쉼표로 구분, 호출 시엔 매개변수 이름: 전달값
구조체
- 데이터를 담은 컨테이너
-다양한 형태의 field 데이터를 담아서 하나의 구조체로 표현 가능
-구조체 안의 함수=메소드/ 변수=속성
-초기화를 자동으로 해줌. class와 달리 초기화 작업 불필요
struct Course {
let name: String
let instructor: String
}
* 상속 불가능
* var도 가능
* apple프레임워크에서 프로그래밍을 할 땐 주로 class를 많이 사용함
*구조체는 보통 '복사'의 개념이므로 안전함을 추구할 때 많이 사용함
*구조체 안에 함수를 넣어서 잘 사용하진 않음
클래스
-초기화 함수 존재 => init
-클래스 안 함수 = 메소드(method)
class Person {
var name: String //한 개의 field 존재.
init(name: String) { //method 존재. 초기화 메소드
self.name = name //받은 name을 클래스의 name에 할당함
}
}
let person = Person(name: "Tommy")
-> person.name => Tommy
메소드
class Person {
...
func sayHello() {
print("I'm \(name)")
}
}
let person = Person(name: "Tommy")
person.sayHello() //이미 person 선언 시 name 변수의 값으로 Tommy를 넘겨줌
상속
class Vehicle { //2개의 요소를 갖는 클래스 , super class or parent class
func wheels() -> Int { //return을 int형으로
return 4
}
func go() {
print("Zoom!")
}
}
//위 클래스의 subclass를 만들어볼거양. override 함수가 있을거양
class Motorcycle : Vehicle { //vehicle class를 ingeritance
override func wheels() -> Int { //wheels함수를 새롭게 다시 작성(재정의)=> override
return 2
} //motorcycle은 subclass로 vehicle의 함수를 사용가능
}
motorcycle.wheels() -> 2
프로토콜
-규약
-예를 들어 각 학교마다 학생회를 만들거임. 근데 그 학생회에는 기획부, 홍보부, 재정부가 있어야해.
-> 따라서 위의 프로토콜을 따르는 학생회는 모두 내가 정의한대로 부서를 만들어야함
=> 내가 정의한 것 == 프로토콜
-프로토콜을 채택해서 각 구조체와 클래스는 해당 프로토콜을 상속 받는 것처럼 사용함
~애플 공식 프로토콜의 정의~
프로토콜이란, 어떤 기능에 적합한
특정 메서드, 프로퍼티 및 기타 요구 사항의 청사진(Bluprint)을 의미합니다
프로토콜은 클래스, 구조체, 열거형에 의해 채택되며,
프로토콜에 정의된 요구사항의 실제 구현을 제공합니다
프로토콜의 요구 사항을 모두 충족하는 모든 유형(클래스/구조체/열거형)은
해당 프로토콜에 부합하다고 합니다
protocol Teacher {
func teach(); //teacher프로토콜을 사용하는 것들은 모두 teach라는 함수를 정의해야함
}
class CS50Teacher : Teacher {
func teach() {
...
}
}
위와 같이 사용할 프로토콜을 :(콜론) 프로토콜명 으로 채택하고 해당 프로토콜에 따라서 정의해야할 것들을 정의함
(class의 상속과 비슷)
Optinal
-swift의 안전성에 해당
-swift의 꽃.. 🌷
-하나의 data type
-"값이 없음"을 뜻함. -> 너 지금 오류났는데 이걸로 앱을 중단시키는 건 너무하니까 프로그램의 안전성을 위해서 오류는 안 낼게 ㅇㅇ..
근데 'nil'을 돌려줄테니 오류인 건 알고 있으렴
-> 0이나 공백을 리턴하지 않고 nil을 리턴하는 이유? : 그것들도 쨋든 다 값이니
-아주아주 특수한 자료형 따라서 nil을 저장할 수 있는 건 only Optonal로 선언된 자료형만 가능
- Non-Optional Type: 그냥 보통 내가 정의하는 상수나 변수 ex. var name: String (타입 어노테이션)
-> 무조건 값을 가져야하는 자료형. 값이 없으면 에러남(선언만 하고 대입 안 하면? error, nil을 대입해도 에러 왜냐면 nil을 저장할 수 있는 건 오직 Optional로 선언된 자료형만 가능
- Optional Type
1) type annotation use
-자료형 뒤에 '?' 붙여주기 => ex. var name: String?
2) type inference use
-타입 추론 이용. 선언과 동시에 값을 초기화 해주는데 이때 초기화되는 값을 nil로 (타입 추론은 초기값을 보고 자료형의 타입을 지정함)
=> ex. var a: Int? = nil
var b = a //옵셔널 타입의 값인 a를 b에다가 선언과 동시에 초기화 해주면 됨
* var age = nil -> error: nil은 없는 값이니까 컴파일러가 값을 보고 자료형을 유추할 수 없음
* var a: String
var b: String?
=> 다름. 위의 타입은 just String
아래의 타입은 Optional<String> (옵셔널 스트링) -> String을 Optional로 한 번 감싼 상태
var name: String? //Optional String Type
if let n = name { //name is 'nil'
print(n) //if u assign a value to name == name has a value, just print it
}
else { //actually run this sentence. B.O u never assigned a value to name
print("No Name")
}
guard let n = name else { //nil값을 처리해주는 guard class. if name != nil assign name to n
print("No Name") // else, print this
return
}
print(n)
nil을 처리하는 class (like 예외처리문)
*보통 작성하는 것을 권고함
* ? : 일반 옵셔널로 일반 타입과는 다른 타입으로 취급됨. 옵셔널 타입-일반타입 간의 연산이나 값의 교환 불가능
* ! : 암시적 추출 옵셔널로 기존 변수처럼 사용이 가능하나 nil 할당이 가능함.
lesson1의 실습 코드
import Foundation
class Track {
let name: String
let instructor: String
init(name: String, instructor: String) { //must
self.name = name
self.instructor = instructor
}
}
let tracks = [ //let tracks: [Track] =[..]
Track(name: "Mobile", instructor: "Tommy"),
Track(name: "Web", instructor: "Brian"),
Track(name: "Games", instructor: "Colton")
]
let students = ["Harry", "Ron", "Hermione"]
var assignments: [String : Track] = [:] //empty dictionary
for student in students { //굳이 말 안 해도 str임을 알아. 왜냐면 들어있는 값들이 다 str이니깐~
let track = Int.random(in: 0 ..< tracks.count) //0~track의 원소 개수개까지 random으로.. = 0~3까지
assignments[student] = tracks[track]
}
for (student, track) in assignments {
print("\(student) got \(track.name) with \(track.instructor)")
}
'Ios' 카테고리의 다른 글
#3: CS50 track - lesson2 (1) | 2024.01.13 |
---|---|
#1. ios개발을 해보자 (0) | 2024.01.13 |