공부 연습장 :-)

TIL_20171211 ~ 20171217

|

2017.12.11

TODO
  • JSON step2
    • iterator 사용 / string, character의 index 사용
    • 특정 string remove
    • [ ]인지 { }인지 판별해서 로직 분리
      • [ ]만 있는 경우 : , 로 구분
        • { }만 있는 경우 : { }세트를 찾는 반복문 사용
        • { }와 value 같이 있는 경우 : { }세트를 찾는 반복문 사용하고 { } 문장 remove까지
      • { }만 있는 경우 : , 로 구분해서 어레이에 넣고 어레이 요소 각각을 :로 분리 > value만 가지고 캐스팅하기
        TIL
  • step1부터 다시 구현 : step1에서는 AnyType을 모두 담는 Array를 만든게 아니라, counting만 하는 식으로 구현한 문제가 있었음
    • 문자를 탐색하고 자르는 부분과 검사하는 부분, 카운팅 하는 부분, 출력하는 부분 모두 따로 객체를 나눔
    • 특히, 객체를 나누기 어려운 부분이나 데이터 처리가 복잡해지는 경우는 데이터 오브젝트를 로직 객체 내에서 생성해서 넘기는 방식으로사용함
    • Any 타입을 그대로 사용한것이 아닌 JSONDataenum으로 정의함
      • enum 연관값, enum 커스텀 타입
  • step2를 재구현하면서 로직 흐름도 그림!

2017.12.12

TODO
  • JSON step2
    • Type ‘JSONTarget’ does not conform to protocol ‘Sequence’ 오류해결
      • JSONTarget 프로토콜을 준수하는 각 객체에 필요한 함수 구현
      • count하는 함수 구현하기
      • value값(parsing target이 되는 값) 가져오는 함수 구현하기 (MyObject객체는 특히 value값을 가져오는 함수로 구현)
      • TargetIdentifier에서 객체 다운캐스팅 하고 그 JSONTarget 타입에 맞는 ValueIdentifier의 parsing함수 호출하기
        • ValueIdentifier의 함수는 private으록 구현하기
TIL
  • 딕셔너리에서 subscript 애플공식문서 subscript(_: )
    Declaration : subscript(position: Dictionary<Key, Value>.Index) -> Dictionary.Element { get }
    

    Return Value A two-element tuple with the key and value corresponding to position.

<JSON readme>

  • step2 커밋 : add case of parsing one object
  • string으로 들어온 분석대상을 하나로 통일하기위해 ParsingTarget으로 통일.
    • ParsingTargetFactory에서 입력받은 문자열을 분석해서 경우에 따라 MyArray나 MyObject가 생성된다.
  • string을 분리해서 분석대상만(array의 value들, dictionary의 경우 value만) [String]형태로 분석 객체에 넘기는 방식
    • 분석하는 객체에서 ParsingTarget(array나 object)을 받아서, 그 컬렉션의 값에 하나씩 접근했어야 했는데 Type 'ParsingTarget' does not conform to protocol 'Sequence'라는 오류가 났다. 각 객체의 속성에 접근해서 index만 넘겨주면 그 index에 맞는 value를 넘겨주는 getEachValue()함수와 for문을 돌리기 위해 객체 속성의 크기를 리턴하는 count()함수를 구현했다.
  • flow
    • ParsingTargetFactory에서 입력값 분석하여 ParsingTarget만듦.(조건에 따라서 ParsingTarget을 준수하는 MyArray나 MyObject)
    • JSONDataFactory에서 ParsingTarget이 array인지 object인지 판단하여 캐스팅하고 내부의 함수에서 그 객체의 각 value에 접근하면서 JSONData로 캐스팅하면서 [JSONData]를 만든다. > 그냥 JSONData만드는걸로 변경

    • [JSONData]를 ValueCounter에 넘겨서 value의 수를 세고 value들의 카운트 수 Data object인 CountingInfo를 만든다.

    • OutputView는 CountingInfo를 받아서 result를 출력한다.
  • Array나 Object인 경우에, JSONDataFactory에서 parsing대상인 value만 어레이에 담아서 ValueCounter로 보냈는데, 이렇게 하면 결국 Any타입 밸류를 담은 object를 만들 수 없을 것 같아서(결국 object의 경우 카운팅만 하게 된 셈..) JSONData enum에 Array와 Object value도 새로운 케이스로 추가했다.
  • 그래서 setTargetType()은 [JSONData]를 리턴하는 것에서 JSONData자체를 리턴 하는것으로 바뀌었다.
  • 이렇게 하니까 counter에서 enum을 바인딩해서 써야 하는게 문제가 됐다!

2017.12.13

TIL
  • 패턴매칭 (enum 바인딩)
  • 스위프트코리아 밋업 참석!

2017.12.14

TIL
  • enum 바인딩
  • JSON step2 : 하나의 배열 입력했을때, 하나의 객체 입력했을때의 빌드 성공!
  • 여러가지 문자열 자르는 방법 알아봄 : range
    • {}문자열 자르는걸 아래와 같이 해보려고 했다. ```Swift // 어레이 안에 딕셔너리가 있는 경우 {} 괄호 사이 글자 따로 저장하고 빼내는 작업 func makeTargetArrayWithObject(_ value: String) -> String{ var objectValue = “”

       if let openParenthesisRange = value.range(of: "{"),
           let closeParenthesisRange = value.range(of: "}", range: openParenthesisRange.upperBound..<value.endIndex) {
      
           let range = openParenthesisRange.upperBound..<closeParenthesisRange.lowerBound
           objectValue = value.substring(with: range)
       }
      
       var pureValues = value.remove(at: range)
      
      
       return objectValue  }
      

    } ```

    문제 : 이렇게 {} 중괄호의 내부 값만 objectValue에 저장할수 있으면, 그 스트링만 빼고 나머지 배열의 순수 value들만 append하고 마지막에 objectValue를 append해서 parsingTarget으로 만들 수 있으니까.. 근데 이렇게 하면 일단 {}로 감싸진 객체가 두 개 이상일때는 제대로 찾아지지 않았다.

<JSON readme> step2 커밋 : enum바인딩 성공, 객체가 같은 enum타입으로 묶여있지만 컬렉션은 달라서 (Array, Dictionary) makeCountInfo에서는 카운트를 해야하는 타겟의 종류에 따라 바인딩을 하고, 이외의 private함수를 선언해서 array일때랑 object일때 카운팅 하는 함수를 따로 만들었다. ValueCounter에서 생성된 CountInfo(CountingInfo에서 이름변경)는 OutputView에 전달되어 출력된다. 하나의 배열 입력했을때, 하나의 딕셔너리 입력했을때의 빌드 성공!

<생각> MyObject가 MyArray에 들어있는 경우를 해야하는데…. string 배열이나 딕셔너리로 넘기지 말고 바로 형태를 판별하고 변환해서 넣어버리는걸로 구현해야겠다고 생각함. 근데 이렇게 하면 분리하면서 형변환하는 객체에 왔다갔다 할수밖에없게 되는데, 이게 객체끼리 의존성이 높아지는게 아닐까?ㅠㅠ…. 아니면 for문을 돌리면서 검사객체의 검사하는 메소드에 넘겨버리고, 검사하는 메소드에서는 계속 appned만 하고, 모든 값이 다 변환되어서 들어간 로컬변수로 다 형변환이 완료된 myArray를 만든다!!!!!!(굳이 myArray,myobject를 string으로 만들지 않는 것)

2017.12.15

TODO
  • JSON step2
    • String을 characterView를 사용해서 한 글자씩 탐색하고 중괄호를 알아내는 방법
    • ParsingTargetFactory객체에서 입력값을 String으로 변환하는 과정은 별로 의미가 없으니 없애고, token을 찾아내면 바로 JSONData 형태로 형변환을 해서 분석대상으로 만들어 낼 수 있도록 구조 개선하기
TIL

JSON step2

  • 입력받은 값이 Array일때를 중괄호가 있을때와 없을때로 나누어서 조건을 분리
  • Array일때는 ParsingTargetFactory에서 바로 값을 나누고, object인 경우에만 MyObject에서 딕셔너리 형태로 값을 나눔
  • 중괄호가 없을때는 바로 value를 쉼표로 나눠서 string value로 저장
  • 중괄호가 있을때는 중괄호의 range를 찾아서 그 range에 해당하는 캐릭터들을 빼고 따로 string배열에 저장한다. (이 작업은 받은 input값에 중괄호가 없어질떄까지 진행- while문 추가)
  • 중괄호가 없는 배열 형태의 input은 쉼표로 나누고 sting value로 저장, 중괄호가 있는 string배열을 다시 추가해서 하나의 [String]으로 또 저장
  • JSONData 타입으로 형변환 하는 작업을 MyArray랑 MyObject 객체에서 각각 따로 함

  • step2 PR은 못보냄 ㅠㅠ - 문제는 객체가 카운팅될때 문자열로도 인식이 돼서, 객체 수 +1 & 문자열 수 +1이 되는 문제가 발생했다. 이를 고치려고 보니 형변환하는 matchValueType()가 의심스러워서 바꾸려고했는데, 문자열을 Int나Bool로 변환하고 성공하면 형태를 변환해서 반환하는 로직에서 그 if문에 걸리지 않으면 다 string으로 형변환해버리는 문제가 있었다.

2017.12.17 TIL JSON step2

  • (12.17 발견){}형태는 당연히 이미 MyObject에서 내부 value들이 다 JSONData타입으로 변환이 된 Dictionary<String,JSONData>인 상태로 matchValueType로 가니 당연히 if문에 걸리지 않아서 String으로 인식되고, 카운팅하는 곳에서는 string과 객체가 모두 인식되니 객체 수 만큼 string 수도 카운팅되는게 당연…
  • MyArray와 MyObject가 변환되는 흐름을 변경
  • JSONDataFactory의 matchValueType()를 string을 받아서 JSONData 타입으로 변경하는 것으로 수정
    • {}가 있으면 JSONData.Object
    • []가 있으면 JSONData.Array로 변경 가능하도록 수정

Comments