Swift) 기본 문법

CokeBear·2022년 8월 2일
0

swift

목록 보기
1/1

1. 상수와 변수

  • 상수는 let
  • 변수는 var

2. 기본 데이터 타입

  • Int -> 64bit 정수형
  • UInt -> 부호가 없는 64bit 정수형
  • Character -> 문자
  • Any -> 모든 형태
  • 그 외 다 동일

    코틀린과 동일하게 타입추론이 가능하다.

3. 컬렉션 타입

  • Array -> 데이터 타입의 값들을 순서대로 저장
var numArr : Array<Int> = Array<Int>()

numArr.append(3)
numArr.append(3)
numArr.append(3)
numArr.append(3)
numArr[0]
numArr.insert(5,at:1)

  • Set -> 같은 데이터 타입의 값을 순서없이 저장 (중복이 없다.)
var set: Set = Set<Int>()
set.insert(10)
set.insert(20)
set.insert(10)

set // 10 , 20

  • Dictionary -> key value 쌍으로 저장 (map과 동일)
var dic: Dictionary<String,Int> = Dictionary<String,Int>()

dic["강창환"] = 3
dic["김택구"] = 3
dic["고은수"] = 5
dic["강창환"] = 51

dic
var dic2: [String: Int] = ["고오공": 1]
dic2

dic.removeValue(forKey: "고은수")
dic

4. func 함수

func 함수명(파라미터 이름 : 데이터 타입) -> 반환 타입 { return 반환값}

5. 조건문

if조건식 { 실행할 구문 } else { 아닌경우 }
swich case

6. 반복문

for in 배열
repeat while
while

7. 옵셔널

var num:Int> = nil
guard 는 ? 같은 역할 값이 있을때면 실행

8. 구조체와 클래스

구조체를 let(const)로 선언시 내부 필드도 const가되어 변경 불가하지만
클래스는 let으로 선언해도 내부필드 변경이 가능하다.

  • 프로퍼티 옵저버

    값의 변경을 감지한다. (저장 프로퍼티와 오버라이드된 저장 프로퍼티에서 사용가능)

class Account {
    var credit: Int = 0 {
        willSet{
            print("잔액이 \(credit)원에서 \(newValue)원으로 변경될 예정입니다.")
        }
        didSet{
            print("잔액이 \(oldValue)원에서 \(credit)원으로 변경 되었습니다.")
        }
    }
}
  • 타입 프로퍼티

    객체를 생성하지 않고 사용가능 ( static 클래스랑 비슷)

struct SomeStructure{
    static var storeTypeProperty = "Some value."
    static var computedTypeProperty: Int {
        return 1
    }
}
SomeStructure.storeTypeProperty
SomeStructure.computedTypeProperty
  • 클래스와 구조체의 차이점

    -> 클래스는 참조 타입 (대입시 주소를 참조)

    -> 구조체는 값 타입 (변수에 대입이 값이 복사)

9. 상속

상속시에 부모 클래스의 프로퍼티와 메소드를 사용할 수 있으며 재정의 또한 가능하다.

  • override 키워드를 붙여서 재정의 해야한다. ex) override func 재정의할메소드() {}
  • 프로퍼티를 재정의 한다는 의미는 프로퍼티의 getter setter 감시 를 재정의한다는 의미다.

10. 타입 캐스팅

타입을 확인하거나 다른타입으로 변환할때 사용 ( is , as )

  • is
for item in library{
	if item is Movie {
    	movieCount += 1
    }else if item is Song {
    	songCount += 1
    }
}
  • as (? , !)
    for item in library{
    	if let movie = item as? Movie {
       	...
       }else if let song = item as? Song {
       	...
       }
    }
    -> ? ! 차이는 타입변환 가능 여부가 불확실 or 확실

11. assert 와 guard

assert?

  • 조건체크 후 조건이 맞지 않으면 메세지를 출력하는 함수
  • 디버깅 모드에서만 작동하며 조건의 검증을 위해 사용
var value = 0
assert(value == 0)
value = 2
assert(value == 0, "값이 0이 아닙니다.")

guard

  • 무언가를 검사하여 다음에 오는 코드 실행여부를 결정
  • guard문에 주어진 조건문이 거짓일때 구문이 실행
func guardTest(value: Int){
    guard value == 0 else {return}
    print("안녕하세요")
}

12. 프로토콜 (interface)

인터페이스처럼 어떤 역할을 지정

  • 사용법
protocol FirstProtocol {
    var name: Int{get set}
    var age: Int{get}
}

위 코드처럼 get set 지정도 가능

  • 타입 프로퍼티를 요구하는 프로토콜
protocol AnotherProtocol {
    static var someTypeProperty: Int{get set}
}
  • 생성자 요구사항 프로토콜
    -> 해당 프로토콜을 받은 클래스는 required 키워드를 붙여서 생성해야한다.
protocol SomeProtocol5 {
    init()
}

class SomeClass :SomeProtocol5{
    required init() {
        
    }
}

13. 익스텐션 (확장 메소드)

extension Int{
    var isEven: Bool {
        return self % 2 == 0
    }
    var isOdd: Bool {
        return self % 2 == 1
    }
}

extension String {
    func convertToInt() -> Int? {
        return Int(self)
    }
}

14. 열거형

enum CompassPoint: String{
    case north = "북"
    case south = "남"
    case east = "동"
    case west = "서"
}

var direction = CompassPoint.east
direction = .west
direction = .north

switch direction {
    case .north:
    print(direction.rawValue)
	case .south:
    print("north")
	default:
    print("etc")
}

enum PhoneError {
    case unknown
    case batteryLow(String)
}

let error = PhoneError.batteryLow("배터리 곧 방전이야 임마")

15. 옵셔널 체이닝

struct Developer {
    var name: String
}
struct Company{
    var name: String
    var developer: Developer?
}

var developer = Developer(name: "kang")
var company = Company(name: "google", developer: developer)

print(company)
print(company.developer!.name)
print(company.developer?.name)

16. try-catch

func chackPhoneBatteryStatus(batteryLevel: Int) throws -> String {
    guard batteryLevel != -1 else {throw PhoneError1.unknown }
    guard batteryLevel > 20 else {throw
        PhoneError1.batteryLow(batteryLevel: 20)
    }
    return"배터리 상태가 정상입니다."
}

/*
 do {
    try 오류 방생 가능코드
 }catch 오류 패턴 {
    처리 코드
 }
 */

do{
    try chackPhoneBatteryStatus(batteryLevel: 20)
}catch PhoneError1.unknown {
    print("알 수 없는 에러입니다.")
}catch PhoneError1.batteryLow(let baterryLevel){
    print("베터리가 \(baterryLevel)입니다.")
} catch {
    print("그 외 오류 발생: \(error)")
}

let status = try? chackPhoneBatteryStatus(batteryLevel: 30)
print(status)

let status = try! chackPhoneBatteryStatus(batteryLevel: 10) // 에러 발생
print(status)

17. 클로저 (익명 함수)

() -> () in


let hello = { () -> () in print("hello")}
hello()

let hello2 = {(name :String) -> String in
    return "hello, \(name)"
}
print(hello2("kang"))


func doSomething(closure: () -> ()){
    closure()
}

doSomething {
    print("gogol")
}

doSomething(closure: { () ->()in
    print("hello")
})

func doSomething2() -> () -> () {
    return {
        () -> () in print("뭐야")
    }
}
doSomething2()()

18. 고차함수

stream과 비슷

profile
back end developer

0개의 댓글