NSString Documentation

SWIFT

func componentsSeparatedByString(_ separatorString) -> [String]

OBJECTIVE-C

- (NSArray<NSString *> *)componentsSeparatedByString:(NSString *)separator


Example

// token으로 문자열 자르기
NSString *list = @"1;2;3;4;5";
NSArray *listItems = [list componentsSeparatedByString:@";"];

// 결과값
// {@"1", @"2", @"3", @"4", @"5"}




WWDC 2015에서 발표했듯이, iOS9에서는 IPv6 네트워크 서비스만을 제공한다. 모든 앱은 2016년 초에 IPv6를 제공하여 앱스토어에 제출해야 한다


앱이 IPv6와 호환되기 위해서는, (=> 리젝을 안당하려면 ㅋㅋ)

  1. 네트워킹 프레임워크(e.g., "NSURLSession")을 사용할 것.
  2. IPv4 전용 API의 사용을 피할 것.
  3. 하드코딩된 IP 주소의 사용을 피할 것.


IPv6 네트워크 테스트: 아직 native IPv6 네트워크에 연결이 불가한데 앱 테스트는 어떻게 할 수 있는가?

  • Mac OS X에서 이를 제공할 예정
  • Mac이 핫스팟을 제공할 때 'IPv6-only' 를 선택하면 IPv6 네트워크 생성 가능
  • 테스트할 앱을 가지고 있는 iPhone/iPadMac을 통해 만들어놓은 personal IPv6-only 네트워크에 연결함. MacIPv4 인터넷으로의 게이트웨이 역할을 함

 

앱스토어에 앱을 제출하기 위해서 개발자들은 상기 방법 등을 이용하여 IPv6 네트워크에서 테스트해보아야 함.
안그러면 리젝 100000000%!




    

제목 : 도쿄타워 - 엄마와 나, 때때로 아버지
작가 : 릴리 프랭키
출판 : 랜덤하우스코리아
발매 : 2007.01.02


정말 오랜만에 읽은 책. 다시 시작하기가 어려웠지만 이 책을 시작으로 천천히 꾸준히 읽을 것이다. 

그동안에도 책을 읽을 때 마음가는 구절을 사진으로 찍어놓곤 했는데 정리하지 못하였다. 이제 블로그에 정리를 해보자! 기회가 되면 그동안 읽었던 것도....

다시 시작하기 전에 두려워하는 나에게 좋은 말을 해주었다. 책을 읽고 나서 느낀점은 많이도 아니고 한줄이면 된다고. 

이책을 읽고 느낀점은 가족한테 잘하자.




릴리 프랭키, '도쿄타워(엄마와 나, 때때로 아버지)' 중에서

어린 아이의 하루와 한 해는 농밀하다. 점과 점의 틈새에 다시 무수한 점이 빽빽하게 차있을 만큼 밀도가 높고, 정상적인 시간이 착실한 속도로 착착 진행된다. 어린 아이는 순응성이 뛰어나고 후회를 알지 못하는 생활을 보내기 때문이다.

이미 지나간 일은 냉혹할 만큼 싹둑 잘라내고, 하루하루 다가오는 광채나 변화에 지조라고는 없을 만큼 대담하게 전진하고 변화해 간다.

그들에게는 '그냥 어쩌다보니 지나가는 시간' 같은 건 없다.

어른들의 하루와 한 해는 덤덤하다. 단선 선로처럼 앞 뒤로 오락가락하다가 떠민 것처럼 휩쓸려간다. 전진인지 후퇴인지도 명확하지 않은 모양새로 슬로모션을 '빨리 감기' 한 듯한 시간이 달리다 그린 시계처럼 움직인다.

순응성은 떨어지고 뒤를 자꾸 돌아보고 과거를 좀체 끊지 못하고 광채를 추구하는 눈동자는 흐려지고 변화는 좋아하지 않고 멈춰석 변화의 빛이라고는 없다.

'그냥 어쩌다보니 지나가는 시간'이 덧없이 흘러간다.

내 인생의 예측 가능한 미래와 과거의 무게. 자신의 인생에서 미래 쪽이 더 중요한 종족과, 이미 지나가버린 일 쪽이 더 묵직하게 덮쳐드는 종족, 그 두 부류의 종족이 가령 같은 환경에서 같은 생각을 품고 있다 해도, 거기에는 명백히 다른 시간이 흐르고 전혀 다른 견해가 생겨난다. /p 81-82


자기 일로 정신없이 돌아가다 보면 뛰건 구르건 그 시간은 정지한 것처럼 느껴진다. 자신밖에 보이지 않고 자신의 체내 시계만 보고 있으면 세상의 시간은 움직이지 않은 거나 매한가지다.

하지만 문득 발을 멈추고 잠시 주위를 둘러보는 여유를 가지게 되면, 문득 많은 시간이 흐러가 버렸다는 것을 깨닫는다.

나 자신이 아니라 대상을 향해 오랜만에 시선을 옮겨갔을 때, 시간이 완전히 정지된 것처럼 보냈던 때에도 분명하게 일력은 넘어가고 또 넘어갔었다는 것을 깨닫는다. / p 210


고독은 사람을 기분 좋은 감상에 취하게 하고 막연한 불안은 꿈을 말하는 데 필요한 안주가 된다.

홀로 고독에 시달리며 불안을 달고 살아가는 때는 사실은 아무 것도 두려워 하지 않는 때이며 오히려 다부진 마음으로 살아가는 때인 것이다. / p 238


5월에 어느 사람은 말했다. 
도쿄든 시골이든 어디서든 마찬가지야. 결국 누구와 함께 있느냐, 그게 중요한 일이라고. / p 240


패턴이 해결하는 문제 이해

  • 튜플(Tuple) 은 그룹화된 값들의 세트이고, 편리하고, 쉽게 사용할 수 있다. 하지만, 사용하는데 한계가 있다.

var products = [
   ("Kayak", 275.0, 10), 
   ("Lifejacket", 48.95, 14), 
   ("Soccer Ball", 19.5, 32)
];
func calculateTax(product:(String, Double, Int)) -> Double {
   return product.1 * 0.2;
}
func calculateStockValue(tuples:[(String, Double, Int)]) -> Double {
  return tuples.reduce(0, combine: {(total, product) -> Double in
      return total + (product.1 * Double(product.2))
  });
}
print("Sales tax for Kayak: $\(calculateTax(products[0]))");
print("Total value of stock: $\(calculateStockValue(products))");

  • 그림 4-1은 함수들과 튜플 배열 사이의 강력한 결합(Tight Couplings)을 보여준다.

  • 강력한 결합도(Tight Couplings)’ 문제에 대한 이해
    • 강력하게 결합된 컴포넌트가 많은 애플리케이션에서 하나의 변경 사항이 연쇄적인 코드 변경을 필요로 한다.
    • 느슨하게 결합된 컴포넌트가 디자인 패턴을 사용하는 주요한 목표이다.(Loose Couplings)




오브젝트 템플릿 패턴의 이해

  • 오브젝트 템플릿 패턴은 클래스구조체를 이용하여 객체를 생성할 템플릿을 정의한다.
  • 애플리케이션 컴포넌트가 객체가 필요한 경우 스위프트 런타임에 요청한다.

  • 스위프트 런타임의 객체 생성 3단계
    => 이 3단계는 여러 개의 객체를 생성할 때마다 반복적으로 수행된다.

        1. 스위프트 런타임은 해당 템플릿 이름과 초기값들로 객체를 생성한다.
        2. 스위프트 런타임은 객체를 저장할 메모리를 할당하고 템플릿을 이용하여 객체를 생성한다.
          (템플릿에 구현된 객체 초기화 메소드로 초기값을 설정하거나 객체 생성을 요청한 포넌트가 제시한 값을 이용해서 초기화가 이루어진다. 스위프트 런타임은 객체 사용 준비를 위한 초기화를 실행한다.)
        3. 마지막으로 스위프트 런타임은 객체가 생성되었음을 컴포넌트에 알려준다.



      오브젝트 템플릿 패턴 구현

      • 튜플 기반 접근 방법과 흡사하도록 Product 클래스를 생성하기
      class Product {
         var name:String;
         var description:String;
         var price:Double;
         var stock:Int;
         init(name:String, description:String, price:Double, stock:Int) {
             self.name = name;
             self.description = description;
             self.price = price;
             self.stock = stock;
         }
      }
      
      • Product class 사용하기
      var products = [
         Product(name: "Kayak", description: "A boat for one person",
                   price: 275, stock: 10),
         Product(name: "Lifejacket", description: "Protective and fashionable",
                   price: 48.95, stock: 14),
         Product(name: "Soccer Ball", description: "FIFA-approved size and weight",
                   price: 19.5, stock: 32)];
      
      func calculateTax(product:Product) -> Double {
         return product.price * 0.2;
      }
      
      func calculateStockValue(productsArray:[Product]) -> Double {
         return productsArray.reduce(0, {(total, product) -> Double in
             return total + (product.price * Double(product.stock))
         });
      }
      • 스위프트 접근 제어(Access Control)의 이해
        • private: 같은 파일 내부에서만 보이고 구성요소 내에서만 사용할 수 있도록 제한
        • internal
          - 애플리케이션 레벨에서 전체 구성요소의 접근이 가능
          - 같은 프로젝트 내에서 import 구문이 필요없음
        • public
          - 외부에 제공되는 프레임워크 등 API 레벨의 접근 권한
          - Objective-C 쪽으로 코드베이스를 공유할 때 사용 


      오브젝트 템플릿 패턴의 장점

      • 튜플은 훌륭한 기능이지만, 클래스나 구조체를 선호하는 이유는 조정 가능하고 느슨한 결합도를 제공하기 때문.
      • 결합도 감소(decoupling)의 이득
        • 컴포넌트 간의 강력한 결합도를 깬다.
      • 캡슐화(encapsulation)의 이득
        • 데이터와 로직을 하나의 컴포넌트에 넣을 수 있다.
        • 하나의 컴포넌트에 기술되므로 코드 가독성이 올라간다.
      • Public 공개의 이득
        • 객체 사용자에게 제공할 공개 API 가능하게 한다.
        • private으로 구현체를 숨길 수 있다.




      오브젝트 템플릿 패턴의 위험

      • 정확한 종류(클래스 or 구조체)를 선택해야한다.
        • 스위프트에서의 클래스와 구조체의 가장 중요한 차이
          : 클래스는 Reference 객체, 구조체는 Value 객체.
        • 이 차이는 프로토타입 패턴에서 자세히 설명된다.(업데이트 예정)


      정리

      • 본 장에서는 스위프트 개발에 있어 “심장”과 같은 패턴을 설명했다.
      • “심장”은 객체 생성에 사용하는 템플릿의 정의이다.



      Ref. Pro Design Patterns in Swift by Adam Freeman.


      최초에 gitignore을 적용하고 나중에 ignore하고 싶은 파일이 생겨서 .gitignore에 추가를 하였지만, 
      'Unstaged files'로 표시되고 적용안될 경우 해결 방법 입니다.

      git rm -r --cached .
      git add .
      git commit -m "Fixed .gitignore" 

       

      출처

      'Git' 카테고리의 다른 글

      [Git] 커밋 메시지 수정하기 - git rebase  (0) 2020.03.06
      [Git] 정의 및 사용방법  (0) 2018.05.29
      [Git] Remote branch 이름 변경하기  (1) 2016.04.06

      + Recent posts