본문 바로가기
프로그래밍 언어/Swift

swift 기본 문법

by zieunee 2020. 1. 31.
반응형

Swift

bundle id >> 앱스토어 올릴때 , 암호화 할 때 필요하다

Main.storyboard

여러개의 화면구조를 하나로 만드는 것

스토리 보드에 처음 view ''-->'' : initial seg

  • 텍스트 박스 > placeholder 로 수정해 줄 수 있음

  • 개발환경 도움을 주기 위해서 assistant mode 가 있음

  • ! : let 로 선언했을 때 값을 바꾸게 될때

  • optinal : 값을 바꾸면 안됨

  • 멤버변수에 접근하기위해 self를 썼는데 ... swift에서는 안쓰는 것을 권장

COCOA TOUCH

  • ios에서 최상위 레벨의 레이어

  • UIKit Framework 화면 표시 담당

  • Foundation는 큰 수정 없이 ios에 적용

swift 언어 특징

  • 안전 제일주의
  • swift coding을 위한 구성
  • 엄격한 타입 검사를 한다.
  • 간결한 문법과 명확한 포ㅛ현
  • 클래스 보단 구조체
  • ...등등
  • 유연한 언어이다.
    • OPP로 개발 가능 / POP로 깨발 가능 / Functional Programming 도 가능 / 섞어쓰기도 가능하다.

유연한 trade off 가 필요하다.

실습

새로운 프로젝트 > playground

automatically run 으로 설정

swift 언어 문법

  • main 함수 없음

  • ; 없음

  • var 보다는 let 사용하기 >> 안정적임

  • converting >> String(width)

let apples = 3
let oranges = 5

let appleSum = "I have \(apples) apple"

print(appleSum)

let fruitSum = "I have \(apples + oranges) fruits"

print(fruitSum)
  • 쉽게 사용 가능

  • hasPrefix, hasSuffix, count 등 표준 함수 활용 가능

  • 튜플

    typealias CLLocationDegress = Double
    let latitude: CLLocationDegress = 34.3731391
    let longitude: CLLocationDegress = 135.5678211
    
    

let myLocation = ("JYP" , latitude,longitude)
myLocation.0
myLocation.1
myLocation.2

let friendLocation : (name:String, latitude:CLLocationDegress, longitude:CLLocationDegress)
= ("Cook",37.331842, -122.033687)

friendLocation.name
friendLocation.latitude
friendLocation.longitude

let distance = (myLocation , friendLocation)
let(me,you) = distance

me.0
you.name

typealias AirportInfo = (ICAO : String, latitude : CLLocationDegress , longitude : CLLocationDegress)
typealias DistanceSource = (from : AirportInfo, to: AirportInfo)
//튜플로 묶여있는것을 또한번 튜플로 묶었음

let fromKIXtoICN: DistanceSource = (("ABC",34.1231,123.2342),("RKSI",34.234234,124.342342))

fromKIXtoICN.from.ICAO
fromKIXtoICN.to.ICAO


- 배열

  ```swift
  let toDo = ["점심식사","커피한잔", "이슈잡기" , "푸시하기"]
  let inProgress : [String] = ["Let's Swift!!"]

  //----------
  var toDo :Array<String> = ["점심식사","커피한잔", "이슈잡기" , "푸시하기"]
  var inProgress : [String] = ["Let's Swift!!"]
  var done  = [String]()
  //-----------

  print(toDo)
  print(inProgress)

  toDo.first
  toDo.last
  toDo.append("퇴근") //error 난다>>> var 로 바꿔줘야함

  toDo = toDo + ["저녁먹고","스위프트 복습"]
  print(toDo)

  inProgress.removeAll()
  inProgress.append((toDo[0]))
  toDo.removeFirst()

  done = done + inProgress

  print(done)

  • dictionary
var toDoWithTime = ["점심식사" : 60 , "커피한단" :10]
var toDowithTime1 : [String:Int] = [:]
var toDowithTime2 : Dictionary = [String : Int]()
print(toDoWithTime)

toDoWithTime["영화보기"] = 120

print(toDoWithTime.keys)
print(toDoWithTime.values)

toDoWithTime["커피한잔"] = nil
//nil >>>  아무것도 없음의 의미
print(toDoWithTime)
  • 흐름제어

    • if, switch

      for-in, for, while

      repeat-while

  • Optional

    옵셔녈 벨류는 내부의 ‘값’을 쓰기 위해서 옵셔널을 ‘벗겨내야’ 함

    let p: String = "123ddf"
    let c = Int(p)
    
    print(c)

    변환에 실패하면 >> 값이 없음 으로 리턴해준다.

    nil

    c 는 값이 있을 수도 있고 없을 수도 있다.

    이 상태를 optilnal 이라고 함

    ?를 쓴다.

let p: String = "123ddf"
let c:Int? = Int(p)

print(c)//결과 nil

let p: String = "123"
let c:Int? = Int(p)

print(c) // 1) 결과 Optional(123) >> Optional을 떼어내는 작업을 해야함

if c == nil{
    print("값 없음")
}else {
    print(c)
}

1) 해결 방법

  • !를 쓰면됨 >> 안정성이 안좋음 >>앱이 죽을 수 있음

    print("값 진짜 있음 \(c!)")
  • if문으로 해결

    if let value = c {
        print("값이 있음 \(value)")
    }
  • implicity unwarpped optional 사용

    • 변수쪽에서 할당받는 값이 반드시 있으니,바로 unwrap 된 채로 사용
  • //Implicity unwarpped optional
    var value2 : Int! = c 
    c = c! + 10   // unwrapping 안되어 있어서 써 줘야 함 
    value2 = value2 + 10 // 선언할때 이미 !로 unwrapping 했기 때문에 
    print(value2)
    
  • guard let 으로 선언

  • Optional Chaining

    배열도 옵셔널 , 그 배열의 값도 옵셔널 이라면?

    typealias Sample = (valueOpt:Int? , value:Int)
    var value3: Sample? = (100,200)
    
    if let v1 = value3{
        print(v1)
    
        if let v2 = v1.valueOpt{
            print(v2)
        }
    }

if 문이 너무 많아 질 수 있음

​ 해결:

if let v2 = value3?.valueOpt{
  print(v2)  
}
// value3 배열의 valueOpt 값 까지 옵셔널 걸어줌 

함수

예시

func greet(person: String, day : String ) -> String {
    return "어서오세요~ \(person) 님, \(day) 일째 로그인이십니다!"
}
print(greet(person:"JYP" ,day: "120"))
func sumOf(numbers: Int...) -> Int{
    var sumTotal = 0
    for sum in numbers {
        sumTotal += sum
    }
    return sumTotal
}//... 여러개의 불규칙한 값을 받을 것이다. 라는 의미
func returnFifteen() -> Int{
    var rValue = 10

    func add(){
        rValue += 5
    }
    add()

    return rValue
}

print(returnFifteen())

First Class Type

//First Class Type ㅣ 함수 > 자료형으로 쓸 수 있다.

func makeIncrement() -> ((Int) -> Int){
    func addOne(number: Int) -> Int{
        return number + 1;
    }
    return addOne
}

let 더하기 = makeIncrement()

print(더하기(8))

함수는 자료형이다.

func hasAnyMatches(list:[Int], condition : (Int)-> Bool) -> [Int]{
    var rValue = [Int]()
    for item in list{
        if condition(item) == true{
            rValue.append(item)
        }
    }
    return rValue
}

func isEvenNumber(number: Int) -> Bool{
    return (number % 2) == 1
}

hasAnyMatches(list: [1,2,3,4,5,6,7], condition: isEvenNumber)

클로저

let closure = { (number : Int) -> Void in
    print("클로저")
}
//int 를 받고 int 를 반환해주는
closure(1)
let numbers = [1,2,3,4,5,6,7]

// 1
numbers.map({(number : Int) -> String in
        return String(number * 3)
})

//리턴에서 이미 string 으로 리턴한다고 명시되어 있기 때문에 >> ->String 이라고 리턴 타입을 안적어 줘도 됨 
// 알아서 합리적으로 리턴을 시켜주기 때문에 return 을 명시해줄 필요 없음 
//
numbers.map({(number : Int)  in
         String(number * 3)
})


//타입도 선언해줄 필요 없음 
numbers.map({number  in
         String(number * 3)
})

//변수명도 적어줄 필요 없음
numbers.map({
         String($0 * 3)
})

//괄호 필요 없음 
//5
numbers.map{
         String($0 * 3)
}

1번과 5번은 같은 함수 이다.

ex> sort

let r2 = numbers.sorted {$0 > $1}
print(r2)
반응형

'프로그래밍 언어 > Swift' 카테고리의 다른 글

swfit 실습 day02  (0) 2020.02.01
IOS Delegate 패턴  (0) 2018.11.25
Swift 언어란?  (0) 2018.11.25
swift 기본 문법  (0) 2018.11.19