Swift Grammers

그 동안 강의 들으면서 나온 문법들 모음

  • Comment: // 한줄 (command+/) , /* 여러줄 */
  • Tuple : 좌표 처럼 여러개의 변수값을 묶어서 정의 할 수 있는 변수

      let coordinates = (4, 6) 
      let x = coordinates.0
      let y = coordinates.1
    
      let coordinateNamed = (x: 2, y: 3)
      let (x2, y2) = coordinateNamed
    
  • Boolean: True, False

      let value = 조건 or true/false 
    
      let value = num1 == num2
    
      let yes = true
      let no = false
    
      let compareTwoNums = num1 > num2
      if compareTwoNums {
          print("True")
      } else {
          print("False")
      }
    
  • 삼항 연산자

      let message: sring
      if 조건 {
      	message = "A"
      } else
      	message = "B"
      }
      print(message)
    
      // 삼항연산자로 변환
      let message = 조건 ? "A" : "B"
      print(message)
    
  • Method vs Function
    • 두 가지 모두 기능을 수행하는 함수이나, obeject에 속하여 기능을 수행하는 함수를 Method라고 칭함.
  • 함수 선언 및 호출
//no parameter
func printName(){
let name = "Daye"
	print(name)
}
printName()

//with 2 parameters
func compareNum(num1: Int, num2: Int){
	num1 > num2
}

//external name: 외부에서 함수를 호출할 때 파라미터의 이름
//               호출 시 별도의 이름을 쓰지 않으려면 "_"로 표현
//internal naem: 함수 내부에서 변수로서의 이름
//value Type: 자료형
//parameter default 값 설정 가능(internalName = 10)
//return Type: 반환값의 자료형, 반환값이 없으면 생략 가능
func functionName(externalName internalName: valueType) -> returnType{

}
functionName(externalName: 100)

//return값이 있는 경우
func totalNum(num1: Int, num2: Int) -> Int{
	let total = num1 + num2
	return total
}

let result = totlaNum(10,300)
print(result)
  • Overload: 같은 이름의 함수를 다른 파라미터를 가지도록 선언하는 기능
func function(num: Int)
func function(num: Double)
func function(number: Int)
  • In-out parameter
//Swift에서 모든 파라미터는 constant이기 때문에 값을 변경할 수 없음.
//값을 변경하고 싶을 때에는 파라미터를 in-out으로 선언
func inrementAndPrint(_ value: inout Int){
	value +=1
	print(value)
}
  • 함수를 파라미터로 사용하기
func add(_ a: Int, _ b: Int) -> Int{
	return a + b
}
func subtract(_ a: Int, _ b: Int) -> Int{
	return a - b
}

func printResult(_ function: (Int, Int)-> Int, _ a: Int, _ b: Int){
	let result = function(a,b)
	print(result)
}

printResult(add, 10, 5)
printResult(subtract, 10, 5)
  • Optional: 값을 가지고 있지 않은 변수를 할당하기 위한 기능 (? nil)
var carName: String?
carName = nil
carName = "benz"

var actorName: String? = nil
let num = Int("10") // num은 Int?(optional integer)

  • 고급 기능 4가지
    • Forced unwrapping: 변수명! Optional 변수에서 실제 값만 꺼내서 사용하는 기능
      var carName: String? = "benz"
      print(carName) // Optional("benz")
      print(carName!) // benz
    
    • Optional binding (if let)
      if let unwrappedCarName = carName {
      	print(unwrappedCarName)
      } else {
      	print("No value")
      }
    
    • Optional binding (guard)
      func printParsedInt(from: String) {
      	guard let parsedInt = Int(from) else {
      		print("Can't covert Int")
      		return //조건에 맞지않으면 바로 탈출
      	}
      	print(parsedInt)
      }
    
    • Nil coalescing
      let myCarName: String = carName ?? "benz" // carName의 값이 nil면 default 값인 benz를 넘겨줌
    
  • Array
    • Array에 담긴 값들은 있을 수도 없을 수도 있기 때문에 모두 Optional임.
var evenNumbers: [Int] = [2, 4, 6, 8]
var evenNumbers2: Array<Int> = [2, 4, 6, 8]

evenNumbers.append(10)
evenNumbers += [12, 14, 16]
evenNumbers.append(contentsOf: [18, 20])

//Array Methods
let isEmptyArray = evenNumvers.isEmpty //Array가 비어있는지 알아보는 메소드(Boolean type)
evenNumbers.count //Array에 담긴 값의 개수 반환
evenNumbers.min()
evenNumbers.max() //Array의 최대, 최소값 반환
evenNumbers.first //Array의 첫번째 값(evenNumbers[0])
let oneToThree evenNumbers.[0...2] //0 ~ 2번째 값 반환(Array)
evenNumbers.contains(3) //Array에 3이 있는지 확인(Boolean)
evenNumbers.insert(0, at:0) //0번째 인덱스에 0을 삽입
evenNumbers.remove(at:0) //0번째 인덱스에 있는 값 삭제
evenNumbers.removeAll() //Array 값 비우기(evenNumbers=[])
evenNumbers.swapAt(0,10) //0번째와 10번째 값 swap
evenNumbers.dropFist(3) 
evenNumbers.dropLast(3) //Array 값에 반영하지 않고 앞or뒤에서 n번째 값을 지운 Array 반환

for num in evenNumbers{
	print(num)
}

for (index, num) in evenNumbers.enumerated() {
	print("idx: \(index), value: \(num)")
}
//idx: 0, value: 2
//idx: 1, value: 4
//.
//.
//.
  • Dictionary
    Key와 Value의 쌍으로 이루어진 자료형. 순서가 없음.
var scoreDic: [String: Int] = ["Daye": 90, "JJong": 80]
var scoreDic2: Dictionary<String, Int> = ["Daye": 90, "JJong": 80]

scoreDic["Daye"] // 90
scoreDic["ryan"] //nil

if let score = scoreDic["Daye"]{
	print(score)
} else {
	print("no score")
}

scoreDic=[:] //Dictionary 비우기

scoreDic["Daye"] = 100 //값 없데이트
scoreDic["apeach"] = 100 //추가
scoreDic["apeach"] = nil //삭제

for (name, score) in scoreDic{
	print("\(name), \(score)")
}

for key in scoreDic.keys{
	print(key)
}
  • Struct
struct Location {
	let x: Int
	let y: Int
	let name: String
}

let store1 = Location(x: 10, y: 30, name: "Gyeonggi")
  • Protocol

    최소한으로 가져야 할 속성이나 메소드를 정의

  • Set

    중복이 없는 unique한 값들을 관리할 때 사용

      var someSet: Set<Int> = [1, 2, 3, 1] //1은 중복이므로 삭제되고 저장 됨 [2, 3, 1]
    
      //Set에서 활용가능한 methods
      someSet.isEmpty
      someSet.count
      someSet.contains(4)
      someSet.insert(5)
      someSet.remove(1)
    
  • Closure

    이름이 없는 method

      var multiplyClosure: (Int, Int) -> Int = { $0 * $1 }
      var multiplyClosure: (Int, Int) -> Int = { a, b in
      	return a * b
      }
    
      //Closure Expression Sytanx
      //Closure expression syntax has the following general form:
      {(parameters) -> returnType in
      	statements
      }
    
    • Capturing Value
      • Closure에 의해 잡혀서 외부 scope에서도 사용할 수 있게된 변수
        let voidClosure: () -> Void = {
        	print("hello closure")
        }
      
        var count = 0
        let incrementer = { count += 1 }
      
      
  • First class type

    변수에 할당할 수 있는 것, 인자로 받을 수 있는 것, 리턴 할 수 있는 것.

  • Completion Block: 수행 과정이 완료됨과 동시에 코드를 수행 하도록 하는 것
  • Higher Oder Functions(고개함수): 파라미터를 함수로 받을 수 있는 함수

  • table view

    여러 아이템을 리스트 형태로 표현할 때 사용하는 object

    • Protocol

      어떤 서비스를 사용하기 위해 명시해 놓은 해야 할 일

        class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate{ }
        //UITableViewDataSource: table view의 셀이 몇개, 어떻게 보여줄지 
        //UITableViewDelegate: table view 클릭시 이벤트
      
  • Type Casting

    Type casting은 instance의 type을 확인하거나 instance의 type을 super class 혹은 sub class type처럼 다루기 위해 사용.

    is, as 연산자로 구현하며 두 연산자는 값의 타입을 확인하거나 다른 type으로 변환하는 용도

    *class: 붕어빵 틀, instance: 붕어빵