일단 검색으로 한글 페이지로도 나오는 해결방법은

다음과같다

 

rm -rf ios/build

한후

react-native run-ios

 

 

다음은 내가 해결한 방법

해당 부분은 appdelegate.m이다.

 

디버그 부분을 위아래 전부다 해보자

 

- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge

{

#if DEBUG

  return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];

//  return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];

#else

  return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];

#endif

}

 

도대체 뭐가 뭔지....

 

두번째 방법은 기존 index로 되어있는게 안되서 아래 릴리즈버전과 동일시로 변경해줬던거 같은데 이번엔 다르게 해줘야 또 들어간다

 

뭐가 변경된건지 감도 안잡힌다

"" 과 ""은 다른문자입니다.

 

이전에 키보드를 만들다 말았었다.

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

 

wiwi-git/FirstKeyboard

키보드 만들어보기... Contribute to wiwi-git/FirstKeyboard development by creating an account on GitHub.

github.com

 

한글 영문 둘다 지원하게 만들려고했고

처음 기획은 메인으로 설치되는 앱에 글자를 매칭해두면

해당 매칭되는 글로 키보드가 배열되는걸 만들고싶었다. 기본은 아이폰이전에 내가 쓰던 LG폰의 기본 자판으로 하려고했었고....

뭐 여튼 중요기능은 LG기본 자판의 롱터치로 특수문자입력하기다

 

완성한다고 쳐도 애플이 이건 기본 자판으로도 충분합니다 라며 기본기능 카피에대한 앱의 리젝사유를 주면서 거부할거같고

이전에 키보드는 커스텀으로 만들수가 없는걸까 궁굼해서 만들기 시작한것도 있어서 그냥 단순히 완결은 생각안하고 만들기 시작했었다

 

이전 이야기는 그만하고 이글을 쓰고있는 이유는

한글 자모의 유니코드 때문이다.

 

한글이 입력되려면 이전에 입력되고있는 애들에 조합이 되어야해서 상당히 골치아파졌다

그래서 이전에 그냥 거기서 그만뒀었고 

키보드관련 일을 잡게되서 이전에 만들었던게 생각나서 완성시켜놓을까 하고 다시 잡고있다.

 

일단 한글 자모는

초성 중성 종성으로 세부분으로 나뉘고

이게 유니코드가 

각각

자음이나 모음 하나로된 문자 하나

자음이나 모음으로 이루어지려고하는 문자하나 로 나뉘는듯 보인다

 

해당글은 문제가 생겨 찾던중

https://winplz.tistory.com/entry/%ED%95%9C%EA%B8%80-%EC%9E%90%EC%9D%8C-%EB%B9%84%EA%B5%90%EA%B0%99%EC%A7%80%EB%A7%8C-%EB%8B%A4%EB%A5%B8-%EC%9E%90%EC%9D%8C%EB%93%A4

 

같은 모양, 다른 값의 한글 자음

과정. - 연락처에 있는 초성, 중성, 종성을 분류하고 비교하는 과정 중 - 자음으로만 저장된 연락처와 정상적인 연락처를 비교 ex) 'ㄱㄱㄴ' , '가나다' - 두 문자열의 첫번째 초성값들을 비교 - 뽑

winplz.tistory.com

을 보고 알았다.

 

이글에선 각각 5가지의 유니코드가 있다고 했는데 난 두가지로 보고있다 

앞에 43이나 44로 시작하는 애랑 125,126 인가 로 시작하는애들

 

그래서 일단은 각각의 초성 중성 종성 배열을 

두가지의 버전으로 새롭게 만들고있다.

 

뭔가 멋진 방법이 있을거라 생각하지만

모르겠고 복잡해서 하드코딩으로 배열을 만들어두려고한다.

 

아무튼 그렇게 하드코딩하던중 

 

누군가가 유니코드는 

"\u{유니코드}"로 글자로 바꿔요! 라고해서 이걸로했는데

왠 한자가 나오는 사태가 발생했다 

또 찾아보니 위키에서 유니코드표를 제공해주는데 숫자가 다르다.....

 

아래 표가 바로 한글 유니코드표이다

 

이 사진대로 "\u{1100}"을 입력하면 ㄱ이 입력된다.

 

도대체 그럼 이전에 본 유니코드값은 또 무엇인가

난감해지고 또 다른 글들을 뒤적거리며 찾았지만 딱히 나오지않았다

 

물론 저 표를 위의 표대로 변경하면 될것으로 보이나 그건또 왠지 싫다.

 

unicodeScalar값으로 뽑아낸 숫자들로 바로 하고싶어져서

유니코드->문자 방법을 아래와같이 변경했다

Character(UnicodeScalar(4352)!)

이렇게 하면  ㄱ이 입력되고 맨위에 있는링크 같은 모양 다르값 자음 이라는 게시글에 나온 숫자대로 가능하다

해당 숫자를 표로 만들어진게 없나 또 찾아보니 아래 링크에있다 (사용할 표를 복사했다.)

http://utne.nvg.org/w/unicode.html

#4352 #4353 #4354 #4355 #4356 #4357 #4358 #4359
#4360 #4311 #4362 #4363 #4364 #4365 #4366 #4367 #4368 #4369
#4370 #4371 #4372 #4373 #4374 #4375 #4376 #4377 #4378 #4379
#4380 #4381 #4382 #4383 #4384 #4385 #4386 #4387 #4388 #4389
#4390 #4391 #4392 #4393 #4394 #4395 #4396 #4397 #4398 #4399
#4400 #4401 #4402 #4403 #4404 #4405 #4406 #4407 #4408 #4409
#4410 #4411 #4412 #4413 #4414 #4415 #4416 #4417 #4418 #4419
#4420 #4421 #4422 #4423 #4424 #4425 #4426 #4427 #4428 #4429
#4430 #4431 #4432 #4433 #4434 #4435 #4436 #4437 #4438 #4439
#4440 #4441 #4442 #4443 #4444 #4445 #4446 #4447 #4458 #4449
#4450 #4451 #4452 #4453 #4454 #4455 #4456 #4457 #4458 #4459
#4460 #4411 #4462 #4463 #4464 #4465 #4466 #4467 #4468 #4469
#4470 #4471 #4472 #4473 #4474 #4475 #4476 #4477 #4478 #4479
#4480 #4481 #4482 #4483 #4484 #4485 #4486 #4487 #4488 #4489
#4490 #4491 #4492 #4493 #4494 #4495 #4496 #4497 #4498 #4499
#4500 #4501 #4502 #4503 #4504 #4505 #4506 #4507 #4508 #4509
#4510 #4511 #4512 #4513 #4514 #4515 #4516 #4517 #4518 #4519
#4520 #4521 #4522 #4523 #4524 #4525 #4526 #4527 #4528 #4529
#4530 #4531 #4532 #4533 #4534 #4535 #4536 #4537 #4538 #4539
#4540 #4541 #4542 #4543 #4544 #4545 #4546 #4547 #4558 #4549
#4550 #4551 #4552 #4553 #4554 #4555 #4556 #4557 #4558 #4559
#4560 #4511 #4562 #4563 #4564 #4565 #4566 #4567 #4568 #4569
#4570 #4571 #4572 #4573 #4574 #4575 #4576 #4577 #4578 #4579
#4580 #4581 #4582 #4583 #4584 #4585 #4586 #4587 #4588 #4589
#4590 #4591 #4592 #4593 #4594 #4595 #4596 #4597 #4598 #4599
#4600 #4601 #4602 #4603 #4604 #4605 #4606

(참고로 ㅛ 가 #4411로 가 잘못입력되어있다 #4461이다)

뭐 아무튼 그렇게 숫자도 얻었고 

 

진행할것이다.

 

일단 자야지....

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

 

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이 좀 이상하게 나와서 걱정했는데 데이터는 잘 받아진다.

class JSONNull: Codable, Hashable {

    public static func == (lhs: JSONNull, rhs: JSONNull) -> Bool {
        return true
    }

    public var hashValue: Int {
        return 0
    }

    public init() {}

    public required init(from decoder: Decoder) throws {
        let container = try decoder.singleValueContainer()
        if !container.decodeNil() {
            throw DecodingError.typeMismatch(JSONNull.self, DecodingError.Context(codingPath: decoder.codingPath, debugDescription: "Wrong type for JSONNull"))
        }
    }

    public func encode(to encoder: Encoder) throws {
        var container = encoder.singleValueContainer()
        try container.encodeNil()
    }
}

 

설치.

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

 

첫 직장을 가지기전 까진 ios앱개발에 대한 흥미 자체가 없었다.

그 곳에서 어쩌다보니 앱을 만들기 시작했고 

어쩌다보니 경력을 쌓고 

어쩌다보니 지금 이렇게 앱만드는것으로 먹고 살고있다.

 

공부 자체도 해보지 않고 당시 필요한 기능만 검색해서 합치다보니 

"이게 바로 가끔 강의에서 듣던 스파게티 코드구나" 라고 스스로 외칠 정도로의 알수없는 코드덩어리가 탄생했고

그 덕분에 이상한곳에서 미묘한 동작을 하는 앱이 완성되었다.

 

아마 회사에 앱제작을 맡긴사람도 결과물을 보고 한탄했을듯하다.

언어도, 앱개발도 만져본적없는 신입한테 앱개발을 맡긴 대표도 어처구니가 없을텐데 결과물을 받아본사람은 얼마나 어처구니가 없었을까

 

그렇게 스위프트와 나와의 인연은 이어지고,

 

이제와서 스위프트 언어에 대해 공부해보고 싶다고 생각이 든다.

돈은 없기에 교재를 사거나 강의를 사거나 하지 않고 

홀로 이것저것 찾아보며 스위프트 언어 튜토리얼을 만들어보려고한다.

 

그래서 찾아보는 순서를 어떻게 할까 고민하는중 그냥 스위프트 홈페이지를 뒤지면서 예제를 만들어보는 방식으로 작성해볼까한다.

 

 

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

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