programmers.co.kr/learn/courses/30/lessons/42586

 

코딩테스트 연습 - 기능개발

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는

programmers.co.kr

스택/큐 분류에 들어있는 문제다.

 

퍼센트지가 들어있는 배열(progresses)이 각각 루프 1당(문제에서의 하루) speeds 배열의 값 만큼 진행되어서

퍼센트지가 100%로 다 채워졌을때가 몇 루프인지 계산하는 문제이다.

 

계산시에 progresses의 값이 들어있는 순서대로 뒷 값이 작은게 몇개인지 저장하고 그 값을 리턴해주면 된다.

 

나는 우선 퍼센트지가 전부다 찼을때의 루프수를 저장해놓기위해 complete배열을 progresses배열의 수 만큼 작성해두고.

progresses를 foreach문을 통해 

내부에 while문으로 퍼센트치를 채워넣으면서 루프수(foreach문안의 변수 day)를 저장했다

 

그후 while문을 통해 complete배열이 앞값과 뒷값을 비교해가며 뒷값이 작을때 +1 뒷값이 클때 다시1 부터 카운트식으로 하여 코드를 짯다.

 

총 두 두분으로 나눠서 했다.

 

    var complete = Array<Int>(repeating: 0, count: progresses.count)
    
    for (i, persent) in progresses.enumerated() {
      var day = 0
      var persent = persent
      while persent < 100 {
        persent += speeds[i]
        day += 1
      }
      complete[i] = day
    }
    
    var i = 0
    var result = [Int]()
    while i < complete.count {
      var commit = 1
      if (i + 1) >= complete.count {
        result.append(commit)
        break
      }
      
      for k in (i + 1) ..< complete.count {
        if complete[i] >= complete[k] {
          commit += 1
        } else { break }
      }
      
      i += commit
      result.append(commit)
    }
    return result

라인 자체는 적어보이는데 두 번째 루프문부분, 값비교하는 부분이 뭔가 찝찝하다 

하지만 채점결과는 통과하니 그냥 넘어가련다. 생각하기 귀찮아졌다.

 

아래링크는 해당 소스가 올려놓은 깃허브 페이지이다.

 

github.com/wiwi-git/Programmers-learn/blob/master/swift/Practice/Practice/FunctionDevelopment.swift

 

wiwi-git/Programmers-learn

Contribute to wiwi-git/Programmers-learn development by creating an account on GitHub.

github.com

 

반응형

programmers.co.kr/learn/courses/30/lessons/42840

 

코딩테스트 연습 - 모의고사

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. 1번 수포자가 찍는

programmers.co.kr

이 글을 쓰면서 전체 라인수를 좀 줄여보고자 변경했는데도 라인수가 좀 크다.

저 사이트는 다른이의 답도 볼 수 있는 서비스를 제공하는데 보고 오니 정말 내 소스가 좀 부끄러워진다.

 

 

 

이번 문제는 배열의 탐색을 묻는 문제인가 싶다.

세명의 사람이 있고 

첫번째 사람은 1,2,3,4,5 ... 1,2,3,4,5 순으로 답을 적고

이런식으로 세명의 정답 적는 배열이 주어진다.

 

세명의 점수를 정답 배열에서 계속 비교해야해서 

해당 내용을 난 TestPaper라는 구조체를 만들어 정리했다.

 

그 후 각각의 총점을 계산하고

각각의 점수를 기준으로 정렬하고 가장 앞에 있는 사람을 뽑는것으로 톱을 정하고

혹시 톱과 같은 점수가 있는지 filter함수를 통해 사람을 추가로 뽑았다.

  struct TestPaper {
    let id:Int
    private let loopAnsers:[Int]
    private var loopIndex:Int = 0
    var score = 0
    var answer: Int {
      mutating get {
        let index = loopIndex
        self.loopIndex += 1
        if loopIndex >= loopAnsers.count { self.loopIndex = 0 }
        return self.loopAnsers[index]
      }
    }
    
    init(id:Int,loopAnsers:[Int]) {
      self.id = id
      self.loopAnsers = loopAnsers
    }
  }
  
  func solution(_ answers:[Int]) -> [Int] {
    var people:[TestPaper] = [
      TestPaper(id: 1, loopAnsers: [1,2,3,4,5]),
      TestPaper(id: 2, loopAnsers: [2,1,2,3,2,4,2,5]),
      TestPaper(id: 3, loopAnsers: [3,3,1,1,2,2,4,4,5,5])
    ]
    // calc score
    for answer in answers {
      for index in 0 ..< people.count {
        if answer == people[index].answer {
          people[index].score += 1
        }
      }
    }
    
    // get top
    let top = people.sorted(by: {$0.score > $1.score}).first!
    
    // get result
    var result = [Int]()
    for person in people.filter({ $0.score == top.score}) {
      result.append(person.id)
    }
    return result
  }

중간에 그냥 주석으로 때워도 될부분이 생각나지 않아 이번편은 모든 부분을 소스로 올렸다.

 

아래 링크로 가면 전체 클래스를 볼 수 있다

 

github.com/wiwi-git/Programmers-learn/blob/master/swift/Practice/Practice/MockTest.swift

 

wiwi-git/Programmers-learn

Contribute to wiwi-git/Programmers-learn development by creating an account on GitHub.

github.com

 

반응형

programmers.co.kr/learn/courses/30/lessons/42583

 

코딩테스트 연습 - 다리를 지나는 트럭

트럭 여러 대가 강을 가로지르는 일 차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 트럭은 1초에 1만큼 움직이며, 다리 길이

programmers.co.kr

문제에 테스트케이스가 다양하게 안되있었으면 뭐가 틀렸는지 모르고 끙끙 거렸을거같네요.

 

이번 문제는 큐는 어떻게 동작하는가에 대한 문제입니다.

스위프트에는 스택과 큐를 따로 자료형으로 정의되어 있지 않는걸로 알기에 따로 구현을 해서 할까 하다가 그냥 진행했습니다.

문제는 별 이상없이 이해가 되는데 문제에 제시된 예시용 표때문에 이게 무슨소리인가 난감해졌었습니다.

문제의 표처럼 하지말고

아래 처럼 하는게 문제 이해가 쉽습니다

 

지나는중의 숫자 뒤의 괄호는 현재 지나는 정도를 나타내봤습니다

문제에 제시된 다리길이가 10일경우 괄호의 수가 10이 되야 지난 트럭에 들어갑니다.

아래표는 다리 길이가 2이고 최대하중에 10입니다. 지난 트럭은 안적었습니다.

시간 대기중 지나는중
0 7 4 5 6  
1 4 5 6 7(0)
2 4 5 6 7(1)
3 5 6 4(0)
4 6 4(1) 5(0)
5 6 5(1)
6   6(0)
7   6(1)

 

계속 루프 해주면서 대기중에 있는 애가 지나는중 배열에 들어갈 수 있는가를 체크하고

지나는중의 배열에 있는 애는 다 지나갔는지 체크해주면 됩니다.

 

  struct Truck {
    let weight:Int
    var position:Int = 0
  }
  
  func solution(_ bridge_length:Int, _ weight:Int, _ truck_weights:[Int]) -> Int {
    func totalTruckWeight(truckArray:[Truck]) -> Int {
      var result = 0
      for item in truckArray {
        result += item.weight
      }
      return result
    }
    
    var passingArray = [Truck]() // 지나는 도중인 트럭을 저장할 배열
    var endArray = [Truck]() // 도착한 트럭을 저장할 배열
    var truckArray = [Truck]()  // 모든 트럭을 넣어둘 배열 
    
    // 매개변수로 받은 애들 Truck구조체 형태로 변경해주기
    
    var waitArray:[Truck] = truckArray // 대기중인 트럭을 넣어두는 배열
    var time = 0 // 반환할 값, 전체 지난 시간
    
    while endArray.count < truckArray.count {
      if passingArray.count > 0 {
      	// 트럭들 포지션 변화
		// 도착한애들 빼주기
      }
      if waitArray.count > 0 {
        // 대기 중인 애들 다리에 올리기 
      }
      time += 1
    }
    return time
  }

 

 

전체 소스는 아래 링크에 있습니다.

github.com/wiwi-git/Programmers-learn/blob/master/swift/Practice/Practice/TruckPassingBridge.swift

 

wiwi-git/Programmers-learn

Contribute to wiwi-git/Programmers-learn development by creating an account on GitHub.

github.com

 

반응형

원래는 6편을 스위프트 언어 공식문서에 Ternary Conditional Operator 라 소개되어있는 연산자에 대해 쓰려고 했으나

해당 내용에 들어갈 조건문부분을 따로 쓰는게 좋을듯하여 본편은 조건문을 다룬다.

 

조건문은 별 다른게없다 분기문이라고 할 수 있다.

 

1~5편 사이의 예제문을 실행해봤다면 알겠지만

여태 실행은 위에서 아래로 차례차례 한줄한줄 실행이 되었다.

 

그런데 모든일이 그렇듯 순서대로 해결하려하면 일이 제대로 처리되지않는 일이 있다.

이를 조건문으로 해당 일들을 분기하여 처리한다.

 

 

조건문

 

1. if 

우선 다룰 if문은 단순하다

네이버사전에서 if에 대해 검색하면 " 만약 ~ 한다면 " 이라는 뜻으로 나온다.

예시도 If you see him ~ 그를 만난다면 으로 예시를 들고있다

 

스위프트에서의 if의 취급도 동일하다

단 if 뒤에 붙는녀석은 이전의 비교연산자와 같은 Bool형태의 값이 붙어서 사용된다.

 

형식-

if 조건  {

  실행문

}

 

이전편에서 나온 비교연산자를 이용해 if문의 예시를 들자면 아래와같다.

 

예시1)

    if 41 {

      print("1번 출력")

    }

    

    print("2번 출력")

결과:

2번 출력

 

해당 소스는 프린트 출력이

2번 출력 

으로 나오게 될것인데

if 4 < 1 의 대괄호 안에 들어가 있는 애는 출력이 되지않는다.

if다음에 나오는 비교연산 4 < 1 이 거짓이기에 해당 if문 안의 내용은 실행되지 않는다.

 

이와 같이 어떠한 조건에 따라 실행 유무를 가리는게 if문 이고 조건문이다.

 

예시2)

    let a = 30

    let b = 40

    

    if a < b {

      print("1번 출력")

    }

    

    print("2번 출력")

 

결과:

1 출력

2 출력

 

 

2. if - else if - else

1번에서 if문은 if뒤에 나오는 조건에 따라 실행 여부를 가렸다.

조건에 따라 실행여부가 두가지 이상일때는 계속 if문만 쓰기에는 힘들다 

 

if문 만을 사용해 두 수를 비교했을때의 경우 아래와 같이 할 수 있다.

 

예시3)

    let a = 30

    let b = 30

    

    if a < b {

      print("1")

    }

    if a > b {

      print("2")

    }

    if a == b {

      print("3")

    }

결과:

3

 

이를 줄이려면 else 와 elseif 를 사용하면된다.

 

 

형식)

if 조건1 {

   실행문1

} else if 조건2 {

  실행문2

} else if 조건3 {

  실행문3

} else {

  실행문4

}

 

 

else if는 연속되게 이전 if 조건이 거짓일경우 확인해보는 것이고

else 는 위의 if들이 전부 거짓일때 실행되는 경우이다

위의 소스를 아래와같이 변경할 수 있다.

 

예시4)

    let a = 30

    let b = 30

    

    if a < b {

      print("1")

    } else if a > b {

      print("2")

    } else {

      print("3")

    }

결과:

3

 

위 예시4는 예시3과 비교했을때 라인수에 대한 이득은 없다.

코드로만 보면 단순히 조건문이 연결되어 가독성이 조금 좋아질뿐이다.

하지만 실제로 돌려보면 예시4에선 저 조건문 총 세번 결과를 보지만

만약 첫번째 조건문이 참일경우 뒤의 연결된 조건은 보지않는다.

실행하는쪽에서 연산을 아끼는 이득이된다.

 

3. swich 문

switch문은 조건문 이라고 부르기가 좀 이상했는데 일단 이곳에 포함시켰다.

스위치문은 조건이 되는 어느 한 값이 어떠한 값을 가질때 이를 실행해라와 같은 느낌이다

예를 들어

let a = "바나나" 라는 a가 있을때

이 a가 바나나가 저장되어 있을 수 잇고.

사과, 또는 멜론 등의 여러가지가 있을 수 있을때 해당 내역을 적는 조건문이다.

 

형식)

 

switch 대상 {

  case 대상과 일치하는지 비교하는 값1: 

    실행문1

  case 대상과 일치하는지 비교하는 값2:

    실행문2

  case 대상과 일치하는지 비교하는 값3:

    실행문3

  default: //위의 모든 case들이 대상과 다를경우 실행

    실행문4

}

 

예시 5)

    var a = "banana"

    switch a {

      case "banana" : print("banana")

      case "apple" : print("apple")

      case "melon" : print("melon")

      case "lemon" : print("lemon")

      case "peach" : print("peach")

      default: print("다른 종류이다.")

    }

결과:

banana

 

이 스위치문은 enum타입의 변수일때 정말 편함을 느낄 수 있는 좋은 녀석인데 이전 3편의 데이터형에서 깜빡한건지 enum에 대한걸 다루지 않았다.

나중에 다루게될것같다. 

 

 

 

 

 

반복문 

반복문은 말그대로 반복하는데 사용한다.

여러 가지 계산에대해 반복적으로 해야하는 사항이 있을때 사용한다.

 

1. while

대상 조건이 거짓이 될때까지 반복하고자 할때 사용한다.

 

형식)

while 조건 { //조건은 시작할땐 참이여야 한다. 참이 아닐경우 시작을 안하고 넘어간다.

  반복할 실행문

  조건을 변화시킬 실행문

} // while문 내부 블록의 조건을 변화시킬 실행문은 없어도 된다. 단 블록 외부에서도 조건에 대한 변화가 없다면 무한루프에 빠지게된다.

 

간략히 어느한 값을 30번정도 반복시키는 while문의 예시를 들어본다.

 

예시6)

    var count = 0

    

    while count < 5 {

      count += 1

    }

    print(count)

결과: 

30

 

count에 계속 +1 식하면서 count값이 30보다 작은지에 대해 검사한다.

해당 루프문은 5보다 작으면 실행하라 인데 실 결과는 30인 이유는

순서가

1. count가 5보다 작은가

2. count에 1 더하기

이런순으로 하기에 그렇다.

 

 

2. repeat - while

위에 while은 순서가 count의 조건을 먼저 확인했는데

반대로 실행먼저하고 조건을 보고싶을 경우도 있다

이럴땐 repeat while문을 쓰면된다.

 

형식)

repeat {

실행문

} while 조건

 

 

위와 결과는 같으나 실행순서만 다른 예제를 들면

 

예시7)

    var count = 0

    

    repeat {

      count += 1

    } while count < 5

    print(count)

 

결과: 5

 

예시6번을 뒤집어본 소스이다

실제로 일단 count값을 먼저 증가시키고 

그후에 다시 실행시킬것인가에 대해 검사를한다.

 

 

3. for문

for문은 주로 인덱스에 해당하는 변수와 같이 사용할때 쓴다.

위에서 count를 사용한것과 비슷한데

while은 사실 저렇게 단순히 +1할때 쓰지는 않는다. for문이 이러한 순서대로 증가하는 값이 필요할때 사용한다.

 

형식)

for 변수1 in 변수1에 담을것 {

  실행문

}

 

예를 들어

1 부터 10까지의 합을 구하려고한다 그러면 아래와 같다

 

예시8)

    var sum = 0

    for i in 1 ... 10 {

      sum += i

    }

    print(sum)

결과:

55

 

sum에 1부터 10까지 변하는 i의 값을 모조리 더하는 반복문이다.

 

1 ... 10 은 Range 타입의 변수를 바로 정의하면서 사용하는것이다.

이 부분은 배열이 들어가도 좋고, 실제로 배열을 넣어서 많이 사용한다.

배열을 넣어서 사용하자면

 

예시9)

    let exArray = ["banana", "apple", "melon","lemon" ,"peach"]

    for i in exArray {

      print(i)

    }

결과:

banana
apple
melon
lemon
peach

 

와 같이 된다.

오른쪽에 있는 값이 여러가지를 가지고있는 녀석을 왼쪽의 변수에 하나씩 차례대로 넣어서 활용하는것이다.

 

Range에 대해서는 나중에 좀더 다뤄볼 수도 있고 없을 수도 있으니 만약 이글로 swift를 공부중이라면 따로 찾아보는것을 권한다.

 

 

 

반응형

스위프트 공식문서의 언어 안내서에는 기본 연사자를 아래와 같은 항목으로 나눈다.

 

0. 할당 연산자

1. 산술 연산자

2. 복합 할당 연산자

3. 비교 연산자

4. 3차 조건 연산자

5. nil-coalescing 연산자

6. 범위 연산자

 

 

 

 

 

너무 다양하게 나눠있어서 놀랐다

 

기본연산자가 이렇게 많으면 이 언어로 프로그래밍을 입문하려는 사람은 어떤 기분일지 상상도 안간다

 

사실 이글을 쓰기 시작할때는 덧셈뺄셈이나 해야지 하고 제목도 덧셈뺄셈으로 했는데 자료를 찾아보고 

산술 연산자로 이름을 바꿨다.

 

이번에 글쓰는건 산술 연산자에 대해 쓸것인데 왜 0번인 할당 연산자는 그냥 넘어가는지에 대해 간략히 이야기하자면

1. Hello World 스위프트의 시작 편에서 할당연산자까지 같이 했다

var textValue = "Hello~"

에서 이퀄(=)이 할당연산자 이다.

 

그럼 산술 연산자에서 

덧셈 뺄셈에대해서만 다뤄볼꺼다

 

미리 말하자면 간략히 할것이다. 

이전편에서 쓰다보니 느낀점은 주구장창 너무 말이 많았다.

중요한 것만 몇개 해주고 예제만 띄여주면 필요한사람이 더 찾아보도록 하는게 좋을거라는 생각이든다

쓰기도 힘들고 내 의욕도 떨어지고....

 

 

 

한국의 초등교육을 받은 누구라면 덧셈 뺄셈을 할줄 알텐데 

바로 그 덧셈과 뺄셈을 프로그래밍으로 해볼것이다.

 

연산 기호는 별 다르지 않다

 

덧셈 기호인 + 

뺄셈 기호인 -

 

좀 다른게 있다면 

항상 값을 받는 애는 좌측에 연산하는애는 우측에 둬야한다

 

var result = 3 + 5

 

이렇게 하면 값을 받는 애인 result는 좌측에 

연산하려는 3 + 5는 우측에 

그렇게 result에 8값이 들어가게된다.

 

그리고 매 기호 매 숫자마다 띄여쓰기를 해줘야된다.

 

사실 단항 연산자중에

숫자앞에 

-5

+5 

이렇게 붙이는 녀석이 있어서

해당값과 연산을 혼동하게 하면안된다.

내용은 그냥 그대로 음수5와 양수5이다.

 

이렇게 잠깐 끼어서 말한이유는 앞으로 내가 이 강좌를 쓰면서 쓸일이 없을거라 판단되서이다.

 

1편에서 나온거랑 잠시 합쳐서 출력을 해보자면

 

var result = 3 + 5
print(result)

 

하단의 콘솔창에 8이 찍히게 될것이다.

 

뺄셈도 마찬가지

 

var result = 3 - 5
print(result)

하단 콘솔창에 -2가 찍힐것이다.

 

덧셈기호에 대해 잠깐 더 짚고 넘어가자면

숫자가 아닌 글자끼리도 된다.

 

아래와 같이 사용한다.

var result = "Hello" + "World"
print(result)

하단 콘솔창엔 HelloWorld가 찍히게 된다.

물론

let a = "Hello"
let result = a + "World"
print(result)

 

또는 

let a = "Hello"
let b = "World"
let result = a + b
print(result)

 

가 같은 출력이 된다.

 

 

또 작은 여담으로

아래의 소스만 먼저보자면 

let valueA = 97
let valueB = valueA + 1
print(Unicode.Scalar(valueA))
print(Unicode.Scalar(valueB))

 

Unicode.Scalar라는거에 숫자 97과 98을 넣어서 출력해보면

Optional("a")

Optional("b")

라고 뜬다!

 

앞에 Optional은 다음에 기회되면 다룰것이고 

앞에있는 a와 b를 보자

 

97이라는 숫자가 a로 바뀌었다

98이라는 숫자가 b로 바뀌었다

 

Unicode 라고 써진거보면 짐작은 가겠지만

전세계의 글자를 컴퓨터에 담아내기위해 지정한 형식인 유니코드에서

97번째가 바로 소문자 a 98번째가 소문자b이다.

c언어를 해봤다면 바로 글자하나에다가 덧셈을 더하면 다음글자가 나오겠지만

아쉽게도 스위프트는 모든 타입은 클래스 라는것으로 되어있어서 바로 연산이 안된다.

물론 되게끔 만들수도 있다

그것에 대해서는 글을 쓸날이 올지는 모르겠다

 

다음 편은 곱셈과 나눗셈, 나머지를 다룰것이다.

 

 

위의 내용은 아래 링크의 내용을 보면서 작성했다.

https://docs.swift.org/swift-book/LanguageGuide/BasicOperators.html

 

Basic Operators — The Swift Programming Language (Swift 5.3)

Basic Operators An operator is a special symbol or phrase that you use to check, change, or combine values. For example, the addition operator (+) adds two numbers, as in let i = 1 + 2, and the logical AND operator (&&) combines two Boolean values, as in i

docs.swift.org

 

반응형

sdWebImage같은 좋은 라이브러리들이 있어서 그냥 가져다 쓰면되긴하지만

없이 쓰려면 아래와 같이 하면된다.

 

do {
    let imageData = try Data(contentsOf: url)
    let image = UIImage(data: imageData)
} catch {
    print(error.localizedDescription)
}

 

Data(contentsOf:)로 받고 해당 데이터로 UIImage를 생성해주면된다.

data로 만들고 하면되는데 왜 바로 사용은 안되는걸까...

 

강좌에 넣어보고싶어서 튜토리얼용 프로젝트를 만들었으나 영상을 찍지않았다.

 

해당 예제는 아래 깃허브 링크에 있다.

 

https://github.com/wiwi-git/WebImageExample

 

wiwi-git/WebImageExample

Contribute to wiwi-git/WebImageExample development by creating an account on GitHub.

github.com

 

이미지는 https://wiwi-pe.tistory.com/45 에 있는 이미지를 써봤다.

이미지URL이 좀 이상하게 나와서 걱정했는데 데이터는 잘 받아진다.

반응형

설치.

https://swift.org/getting-started/

 

Swift.org

Swift is a general-purpose programming language built using a modern approach to safety, performance, and software design patterns.

swift.org

스위프트의 공식 홈페이지에 들어가면

getting-started 페이지에 다양한 os에서의 설치방법을 안내하고있다

이방법은 Ide를 제외한 방법이라 솔직히 별로 읽어보고 싶지도 않은 내용들이다.

당신이 맥os를 사용중이라면

그냥 단순히 앱스토어에 들어가거나 애플 디벨로퍼 사이트(https://developer.apple.com/kr/develop/)에 들어가서 xCode를 다운로드 및 설치를 하면된다.

 

내가 여기서 사용하는 xcode의 버전은 12.2  버전이다.

 

만약 제대로 설치가 됐다면 그냥 터미널을 열고 

swift --version 

이라고 쳐보면 버전 정보가 뜬다!

나는

Apple Swift version 5.3.1  라고 뜨고있다

 

이 다음부터는 xcode의 플라이그라운드를 사용해서 할 예정이지만

지금은 스타트페이지의 안내대로  터미널에서 돌려볼것이다.

 

0. 터미널에서 swift를 입력한다

1. let 과 var

어떠한 값을 담으려고 할때 담는곳의 지정을 스위프트는 두가지로 할 수 있다

let 과 var, 이는 변하는지 않는 수와, 변하는 수 를 구분한것으로 

이것의 차이에대해 왜 전부 편하게 var로 사용하지 않는것인가를 묻는다면

자세한 답변을 해줄 능력이 없다.

대신 

https://stackoverflow.com/questions/24002092/what-is-the-difference-between-let-and-var-in-swift

해당 스택오버플로우의 게시글에서 많은 토론이 오간것을 읽어보는것이 좋을듯하다.

물론 필수는 아니다.

 

 

난 시작할때는 이것만 알고 시작했다

 

0. let 은 변하지 않는 값을 담을때 사용하고,

1. var 는 변하는 값을 담을때 사용한다.

2. let은 var보다 컴파일시 속도가 빠르다

3. let으로 지정 할 수 있는것은 let으로 지정해서 코드의 뒤에서의 사용할때 실수를 줄일 수 있다.

 

 

그렇게 이제 

let을 사용해서 글자를 단어 두개를 담아보려고한다.

추후 글자하나를 Char형 값, Char형 변수, Char

글자 여러개를 문자열, String형 값, String형 변수, String 으로 부를것이다.

이러한 내용은 값을 여러가지로 분류하여 사용하기 쉽도록 분류해 저장하는 약속중에 하다이다. 

여라가지의 형식, 앞으로는 타입으로 부를 이를 기억해놔야 한다.

 

다시 정리하자면

문장을 저장하기위해 상자를 준비하려고하는데

이를 문장은 String 이라는 형식으로 저장할것이고

저장하는 공간을 마련하려는데 이 공간은 한번 저장후 변하지 않을것이라 let을 사용하여 저장할 것이다.

 

저장 할때는

저장하려는 공간의 형식(let / var) 공간의 이름 = 값 

이렇게 저장한다.

 

그렇게 

let message = "Hello World" 의 탄생이다.

여기서 문자열, 문장은 쌍따옴표를 해줘야한다.

 

항목 0 에서 터미널에서 연 swift에서 

위의 내용을 적고 엔터를 눌러본다

사진에는 끝에 ;(세미콜론)이 들어갔으나 들어가지도 않아도 된다.

1번줄 아래에  청색글씨로 message라는 공간에 String 형식으로 Hello World가 저장되었음을 알려주고 있다.

 

이제 이를 출력하는 가장 기본적인 함수 프린트를 사용해 볼것이다.

스위프트는 여러가지의 함수를 만들어서 사용하게 될것인데

함수는 간략히 설명하자면 나는 어떠한 동작을 하나로 만들어둔 도구라고 정의하고있다.

해당 함수에 대한 이야기는 좀더 나중에 다룰것이고 

지금 쓸 print라는 이름의 함수는 

들어온 값을 터미널에 출력해주는 기능을 가졌다.

 

후에 이 함수를 사용할때 호출한다 라고 할것이다.

 

이 print를 호출하려면 아래와 같다

 

print(값)

 

이제 터미널창에서 1번라인에 저장했던 mesage라는 값을 print를 사용해서 출력해보자

 

 

2번 라인 아래에 Hello World라고 찍혔다.

 

 

 

이번 내용을 요약하자면

맥에서 스위프트를 시작할땐 xcode앱을 설치하면된다.

값을 저장할때는 let과 var를 사용해서 공간을 만들어 저장할 수 있다

let은 변하지않을 값과

var는 변할값을 저장할때 사용한다.

값을 저장할 공간은 각각의 이름을 가진다.

문장을 쓸때는 쌍따옴표를 사용한다.

문장은 저장될때 String 형식으로 저장된다.

예시 코드는 let name = "홍길동" 이다.

함수라고 하는  어떠한 동작을 하나로 만들어둔 도구중 print라는 함수는 값을 터미널에 출력하는 함수이다.

위 name을 출력하려면 print라는 함수를 아래와같이 호출하면 된다.

print(name)

 

 

 

--

위 내용들은 아래 swift 공식 홈페이지 가이드북의 내용을 보면서 만들었다.

https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html

 

The Basics — The Swift Programming Language (Swift 5.3)

The Basics Swift is a new programming language for iOS, macOS, watchOS, and tvOS app development. Nonetheless, many parts of Swift will be familiar from your experience of developing in C and Objective-C. Swift provides its own versions of all fundamental

docs.swift.org

 

반응형

요즘 할때마다 검색하게 되는거같아서

JsonEncoder

JsonDecoder

JSONSerializtion.jsonObject

JSONSerializtion.data

에 대해 사용한 예제를 적어봤다.


struct Person:Codable{
    let id:Int
    let name:String
    let sex:String
}

let person = Person(id: 0, name: "홍길동", sex: "male")

do {
    //struct to jsonData
    let jsonData:Data = try JSONEncoder().encode(person) // data
    print(jsonData)
    print()
    
    //jsonData to string
    let jsonString:String = String.init(data: jsonData, encoding: .utf8) ?? "err"
    print(jsonString)
    print()
    
    //string to jsonData
    let jsonData2:Data? = jsonString.data(using: .utf8)
    print(jsonData2)
    print()
    
    //jsonData to dictionary
    let jsonDic = try JSONSerialization.jsonObject(with: jsonData, options: []) as? Dictionary<String, Any> ?? [:]
    print(jsonDic)
    print()
    let jsonDic2 = try JSONSerialization.jsonObject(with: jsonData2!, options: []) as? Dictionary<String,Any> ?? [:]
    print(jsonDic2)
    print()
    
    //dictionary to jsonData
    let jsonData3:Data = try JSONSerialization.data(withJSONObject: jsonDic, options: .sortedKeys)
    print(jsonData3)
    print()
    
    //jsonData to struct
    let structForm:Person = try JSONDecoder().decode(Person.self, from: jsonData)
    print(structForm)
    
} catch let err{
    print("err:\(err.localizedDescription)")
}

 

struct 를 jsonData로 JSONEncoder

string 을 jsonData로 String.data(using: .utf8)//다른 형식으로 지정하면 어떻게 될지 안해봤다.

dictionary 를 jsonData로 JSONSerialization.data

 

jsonData를 string으로 String(data:,encoding:)

jsonData를 struct로 JSONDecoder

jsonData를 dictionary로 JSONSerialization.jsonObject

 

아 헷갈려....

 

반응형

+ Recent posts