기본 콘텐츠로 건너뛰기

iOS Swift 학습 로그

오래간만에 의뢰로 iOS app을 만들고 있다.
정말 많이 편해졌다. 놀랍다.
swift만해도 벌써 몇번이나 업데이트 하고;

일단 pod 파일. cocoapod은 정말 너무 좋다.
먼저 프로젝트 생성 하고 Meteor DDP를 쓰기 위해 touch Podfile 하고

platform :ios, '8.0'
use_frameworks!

pod 'Meteor'

이렇게 쓰면 끝
pod install 한 뒤 *.xcworkspace 를 열면 끝.
* 주의: install중 중간에 정지하면 기존 pod 가 망가질 수 있음

사용은 AppDelegate.swift를 열고
전역 변수로 
let Meteor = METCoreDataDDPClient(serverURL: NSURL(string: "ws://www.YOURMETEORAPP.com/websocket")!)

지정하고 

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        Meteor.connect()
        
        return true
    }

이런 식으로 Application 기동 시 Meteor 접속.

* swiftDDP 를 내장한 RealmMeteor가 더 좋아보인다.

Storyboard 의 segue (세그웨이라고 읽음) 상당히 좋았다.

일단 첨에 진입점이 되는 Controller 에 Show Attributes Inspector를 열고 

Is Initial View Controller를 체크.
실수로 지우거나 새로 Tab Bar/Split View/Collection View/Navigator Controller 등을 생성할 때 꼭 확인하자.

View와 연결되는 *.swift controller들을 만들 땐import Foundation

import UIKit

class YOURController:UIViewController {
}

으로 시작.

간단한 사용자 정보 저장은 Key/Value Store인 NSUserDefaults.standardUserDefaults() 를 사용.

읽기는 (Boolean의 경우)

userDefaults.boolForKey("KEY")

쓰기는

userDefaults.setBool(true, forKey: "KEY")

이런 식. 다른 타입도 대동소이.

Contstraint는 뭔가 헷갈린다.
배치를 다 한 뒤 해주는 게 삽집을 덜 하는 듯.

Segue는 swift안에서 수동으로 할 때 Identifier 를 지정해야 한다.



이렇게 Segue를 선택(파랑색으로 변함)하고 Attribute Inspector에서 Identifier를 지정.

performSegueWithIdentifier("noticeSegue", sender: self)
이런 식으로 Identifier를 넣어서 사용한다.
modal Popup의 경우 viewDidLoad() 에서 호출해도 잘 되더라.

닫을 때는
self.dismissViewControllerAnimated(true, completion: {})

이런 식으로 닫으면 됨.

스토리보드와 코드사이에서 ctrl 드래그로 IBOutlet 이나 IBAction을 지정할 때
오른쪽 상단에 원두개가 겹쳐있는 아이콘(Show Assistant editor)를 열면 편리.

주의할 점은 왼쪽에 있는 Project Navigator 에서 파일을 선택해도 왼쪽 에디터만 바뀐다.
오른쪽은 상단 바를 클릭해서 찾아가야함.

UIWebView 사용 시 info.plist 에 권한을 열어줘야함.
안그러면 사용할 수 없다.

App Transport Security Settings > Allow Arbitrary Loads 에서 Boolean 을 YES로

초기 로딩할 땐
webView.loadRequest(NSURLRequest(URL: NSURL(string: "http://YOURURL/")!)) 

이런 식으로 쓰면 된다.
Memory Warning이 나면서 Crash 할 수 있는데

    override func didReceiveMemoryWarning() {
        // prevent MemoryWarning
        NSURLCache.sharedURLCache().removeAllCachedResponses()
    }

didReceiveMemoryWarning를 받아서 캐쉬를 지워주면 좀 낫다고 한다.

UIImagePickerController 사용 시 해당 Controller 에 UIImagePickerControllerDelegate, UINavigationControllerDelegate 를 추가해야함.

class CameraController:UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
  ...
}

이런 식.

objective-c 형식의 파일은 header(*.h)가 들어간 파일을 swift로 bridge 파일 만들고 Build Settings 에 Swift Compiler - Code Generation > Objective-C Bridging Header 아래 Debug / Release 아래 각각 만들어 준다.


마지막으로 *.xcdatamodel 에서 Attribute명으로 description 을 사용할 수 없다. 주의.

이 블로그의 인기 게시물

Unicode 2.0 에서 한글의 이해

요즘 SNS이나 SNG등등 기계적으로 문장을 생성하는 프로그램들이 넘쳐나는 시대에 의외로 한글처리를 제대로는 프로그램들이 드물구나 하는 생각에 간단한 한글 자소 분석기를 만들어보았다.
링크는 이쪽(http://jsbin.com/ofoqal/10/edit)

애초에 만든 목적은 다음과 같다.
조사처리(은/는, 이/가, 을/를 등등)를 위해 단어의 마지막 글자의 종성을 조사하기 위함인데 예문을 들어보자면

"준기 강남에서 사진 찍었다."
"예슬 홍대에서 식사 했다."
"슬기 대화방에서 나갔습니다."

"준기님은 강남에서 사진님을 찍으셨습니다 고갱님" 이라고 말하면 할말 없다.

한국식 소프트웨어(꼭 소프트웨어가 아니더라도)의 특징이자 장점이 무엇이냐라고 물으면
귀찮을 정도로 깨알같은 디테일이라고 대답할텐데 한글 기계화 작업에 대한 중요성은 프로그램을 만드는 사람들에게도 별로 중요하게 다가오지 않나보다.

에또 사설이 길었다.
한때 우리는 한글코드체계의 비표준 숲속에서 너무도 괴로운 나날들을 보낸 역사가 있다.
KSC5601부터 시작해서 Microsoft통합형한글을 지나 Unicode 2.0의 시대가 왔다.

개인적으로 UTF-8을 사용하지 않고 EUC-KR이나 CP949를 쓰는 제품이나 서비스의 업체의 대표/관계자에게 1억 미만의 벌금 혹은 3년 이하의 금고형의 실형을 내려줬으면 할 정도로 너무나 많은 사람들을 불행하게 하고 막대한 비용을 지출한 악의 근원이라고 생각한다.

하지만 광명이 왔다.
기계적으로 납득이 가능한 검색 및 정렬이 용이한 Unicode 의 시대가 열렸단 말이다.
지금 당신이 복사해서 붙이고 있는 팁들 보다 훨씬 쉽고 명쾌하니 다음 그림을 한번 보자.
(출처:http://www.w3c.or.kr/i18n/hangul-i18n/ko-code.html) 어떤가?
무쟈게 쉽지 않은가?

현대 한글은 초성 19자, 중성 21자, 종성 27자로. 총 19 x 21 x 28 (종성없음 포함…

즐거운 Online Prototyping Tool 들

jsbin, codepen, jsfiddle 이런 것들은 일단 생략. 너무 유명한 것들이라.

https://launchpad.graphql.com - node.js 기반 graphQL 연습장. 이것만으로도 충분히 훌륭한 백엔드
https://codesandbox.io/ npm 사용이 가능한 클라이언트 사이드 연습장. webpackbin이 너무 문제가 많아서 찾아본 것.

https://scrimba.com 이건 codesandbox+ asciinema(https://asciinema.org/) 같은 느낌인데 키 녹화와 음성 녹화 기능이 추가되었다. 다 좋은데 화살표 키로 빨리감기 뒤로감기 기능이 안되고 익스포트(youtube등)으로 지원이 없는게 아쉽다.

이 둘이 만나면? https://codesandbox.io/s/jvlrl98xw3?from-embed
뭐야 이거 무서워 하지마 ㄷㄷ;  graphql+react-native-web(부왘ㅋㅋ)

https://repl.it/languages 전통을 자랑하는 REPL 도구. 지원 언어 종류가 -_-;;;;;

https://tio.run/# repl.it? 장난함? 얘는 지원 언어가 무려 386종류. J랑 아희도 있다.

https://play.golang.org/ 즐거운 go playground. 소스 포멧팅 넘 좋아.

http://decaffeinate-project.org/repl/ 최고의 coffeescript REPL. 원래 용도는 coffee를 ecma6코드로 바꾸는 것이지만...

https://scaphold.io
https://www.graph.cool/ graphql backend service. scaphold.io는 설치도 필요없는 클라우드. graphcool은 호스팅+클라우드 다있음. 둘 다 막상막하. 푸쉬서버도 되고 뭐 미친득.

https://glitch.com/ gomix에서 결국 glitch로 안착.  node.js

https://www.shadertoy.com 잘하고 싶다! 쉐이다! 오디오도 된다!

http:/…

graphql 연습 /w launchpad

https://launchpad.graphql.com/mw9wkzv99
단순 전체쿼리+조건쿼리+추가

http://graphql.org/graphql-js/passing-arguments/
참고. random ID는 crypto 1.0.1 사용
  type Query {
    Members: [member]
    getMember(id: ID!): member
  }
  type member {
    id: ID!
    text: String
  }
  input memberInput {
    text: String
  }
  type Mutation {
    addMember(member: memberInput): member
  } SQL 정의. facebook 쪽은 스트링에 지지는 거 진짜 좋아하네. *.gql 파일이 있다고 하니 이해해주자.
resolver는 var buffer = [];
const resolvers = {
  Query: {
    Members: (root, args, context) => {
      return buffer;
    },
    getMember: (id)=> {
      return buffer.find(o=>o.id)
    }
  },
  Mutation: {
    addMember(_, {member}) {
      const mm = { ...member, id:randomBytes(10).toString('hex') };
      buffer.push(mm);
      return mm;
    }
  }
}; 평범 평범.
https://dev-blog.apollodata.com/tutorial-graphql-subscriptions-server-side-e51c32dc2951 다음으로 pub/sub 연습.
https://launchpad.graphql.com/xvn94n3ql   type Subscription {
    memberAdded: member
  } member가 added되는 순간을 감시. imp…