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

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

 

아 헷갈려....

 

반응형

단어를 찾기전에 잠시 인덱스에 대해 이야기를 해보자

 

스위프트의 문자열 내부는 인덱스로 찾는다

아래 10글자의 문자열이 담긴 text변수는

let text = "가나다라마바사아자차"

기본적으로 startIndex와 endIndex라는 속성을 가지고있다.

 

그래서 내부 인덱스를 검색해서 문자열 안에서 문자열을 빼내려면 인덱스범위를 포함하고있는

Range라는 녀석을 만들어서 배열에서 인덱스로 뽑아내듯 문자열 옆에 붙여주면 뽑아진다.

 

그래서 아래와 같이 처음과 끝을 지정해서 뽑아주면 처음 문자열과 같은 내용이 출력된다.

 

 

조금 특이한게 끝의 인덱스를 포함을 안시켜야 나온다.

 

이제 다시 원래 하려던 문자열 내부의 단어를 찾아라라는 주제로 돌아오면

 

문자열 내부에 어떠한 단어가 있는지만을 판단하기에는 매우 좋은 함수가있다

String 클래스에는 contains()라는 함수가 있는데

 

이를 이용하면 

let isContains = text.contains("다라")

위 코드는 text에 만약 "다라"가 포함되어있다면 true를 아니라면 false를 반환해준다.

 

단어가 있는지는 검사할 수 있으나 이 방법으론 단어가 어디에 있는지도 찾지 못한다.

위에서 문자열 내부에 값을 뽑아내려면 인덱스로 찾는다고했다.

 

그리고 그 인덱스는 range로 만들어내야 한다. 

 

그리고 String 클래스는 인덱스를 만들어주는 함수중 range() 라는게 있다

 

let range0 = text.range(of: "다라")

 

이렇게 하면 text 내부에 "다라" 라고 적힌 녀석중 가장 처음녀석의 위치(인덱스)를 반환하게 된다.

위치일뿐이지 아직 단어 자체는 없다.

 

이 범위, range는 다양하게 쓸 수 있으나 여기서는 별 의미없이 해당 단어 위치만을 뽑아와 서브로 만들어줄꺼다.

총 세개의 범위에서 뽑아낼건데

 

1. 단어 시작전까지 : w0

2.단어 : w1

3.단어 이후 부터 끝까지 : w2

 

 

해당 소스를 돌리면

 

가나

다라

마바사아자차

 

라고 출력이 된다 

위부터 w0 ~ w2 순이다.

 

위 소스들을 좀 정리하자면 

 

 

guard로 "다라"가 없으면 nil을 있다면 해당 세부분을 String으로 변환해서 반환하는 함수로 만들었다.

참고로 문자열에서 Range를써서 뽑은 값은 SubString으로 String으로 변환해줘야 편하게 쓸 수 있다.

 

 

 

 

그냥 문자열을 쪼개는건 split이 편하다.

 

String.range는 아래와 같이 조건을 줘서

검색범위(range), 검색조건(아래소스는 뒤에서부터 검색), NSLocal.... 어느때 사용하는지를 모르겠다.

let range = text.range(of: "다라", options: .backwards, range: text.startIndex ..< text.endIndex, locale: nil)

 

위 코드처럼 조건을 줘서 위치검색이 가능하다.

 

 

 

반응형

code -8번항을 보려고 들어갔다가 그냥 전부 정리해두려고 적습니다.

애플 개발자문서에서는 이름만 나오고 값소개가 안되있길래 그냥 라이브러리쪽 복사해서 보기편하려고 번역기 돌렸습니다.

 

 

public enum Code : Int {

    /// Authentication was not successful, because user failed to provide valid credentials.

    // 사용자가 유효한 자격 증명을 제공하지 못했기 때문에 인증에 실패했습니다.

    case authenticationFailed = -1

 

    /// Authentication was canceled by user (e.g. tapped Cancel button).

    /// 사용자가 인증을 취소했습니다 (예 : 취소 버튼을 탭함).

    case userCancel = -2

 

    /// Authentication was canceled, because the user tapped the fallback button (Enter Password).

    /// 사용자가 대체 버튼 (암호 입력)을 탭했기 때문에 인증이 취소되었습니다.

    case userFallback = -3

 

    /// Authentication was canceled by system (e.g. another application went to foreground).

    /// 시스템에서 인증을 취소했습니다 (예 : 다른 애플리케이션이 포 그라운드로 전환됨).

    case systemCancel = -4

 

    /// Authentication could not start, because passcode is not set on the device.

    /// 기기에 비밀번호가 설정되어 있지 않아 인증을 시작할 수 없습니다.

    case passcodeNotSet = -5

 

    /// Authentication could not start, because Touch ID is not available on the device.

    /// 장치에서 Touch ID를 사용할 수 없어 인증을 시작할 수 없습니다.

    @available(iOS, introduced: 8.0, deprecated: 11.0, message: "use LAErrorBiometryNotAvailable")

    case touchIDNotAvailable = -6

 

    /// Authentication could not start, because Touch ID has no enrolled fingers.

    /// Touch ID에 등록 된 손가락이 없어 인증을 시작할 수 없습니다.

    @available(iOS, introduced: 8.0, deprecated: 11.0, message: "use LAErrorBiometryNotEnrolled")

    case touchIDNotEnrolled = -7

 

    /// Authentication was not successful, because there were too many failed Touch ID attempts and

    /// Touch ID is now locked. Passcode is required to unlock Touch ID, e.g. evaluating

    /// LAPolicyDeviceOwnerAuthenticationWithBiometrics will ask for passcode as a prerequisite.

    @available(iOS, introduced: 9.0, deprecated: 11.0, message: "use LAErrorBiometryLockout")

    /// 실패한 Touch ID 시도가 너무 많았 기 때문에 인증에 실패했습니다.

    /// 이제 Touch ID가 잠겨 있습니다. Touch ID를 잠금 해제하려면 암호가 필요합니다. 평가

    /// LAPolicyDeviceOwnerAuthenticationWithBiometrics는 전제 조건으로 암호를 요청합니다.

    case touchIDLockout = -8

 

    /// Authentication was canceled by application (e.g. invalidate was called while

    /// authentication was in progress).

    /// 인증이 애플리케이션에 의해 취소되었습니다 (예 : invalidate가 호출되는 동안

    /// 인증이 진행 중입니다)

    @available(iOS 9.0, *)

    case appCancel = -9

 

    /// LAContext passed to this call has been previously invalidated.

    ///이 호출에 전달 된 LAContext는 이전에 무효화되었습니다.

        @available(iOS 9.0, *)

    case invalidContext = -10

 

/// 장치에서 생체 측정을 사용할 수 없기 때문에 인증을 시작할 수 없습니다.

 @available (iOS 11.0, *)

 public static var biometryNotAvailable : LAError.Code {get}

 

 

 /// 생체 측정에 등록 된 ID가 없기 때문에 인증을 시작할 수 없습니다.

 @available (iOS 11.0, *)

 public static var biometryNotEnrolled : LAError.Code {get}

 

 

 /// 실패한 생체 측정 시도가 너무 많았 기 때문에 인증에 실패했습니다.

 /// 이제 생체 측정이 잠겨 있습니다. 생체 측정을 잠금 해제하려면 암호가 필요합니다. 평가

 /// LAPolicyDeviceOwnerAuthenticationWithBiometrics는 전제 조건으로 암호를 요청합니다.

 @available (iOS 11.0, *)

 public static var biometryLockout : LAError.Code {get}

 

 /// 금지 된 UI를 표시해야하므로 인증에 실패했습니다.

 /// interactionNotAllowed 속성을 사용합니다.

 

 @available (iOS 8.0, *)

 case notInteractive = -1004

}

반응형

https://wiwi-pe.tistory.com/73

 

firebase를 다루면서 며칠만에 열어본 프로젝트가 오류를 뱉는다.

오류 내용은 30개의 정의되지 않은 내용이 있다는 사항 "_OBJC_CLASS_$_APMAnalytics", 가 없다 뭐 가 없다  내가 정의하지않은 부분이라 당황하면서도 클린도 해보고 껏다 켜보기도하고 해도 안되다가 �

wiwi-pe.tistory.com

위 게시글 쓰면서 라이브러리가 손상됐다기보단 라이브러리가 변경되어서 다루는부분에서 문제가 생긴줄 알았는데 파일자체가 손상된거였다.

 

손상되는 이유는 어이없게도 icloud 자동업로드 기능...

 

항상 나에게 도움을 주시는 스택오버플로우에서 나온 답변이다.

 

https://stackoverflow.com/questions/56931305/framework-not-found-googleappmeasurement-getting-error-while-adding-framework

 

"Framework not found GoogleAppMeasurement" Getting error while adding framework manually

when I try to add framework manually it shows me error like " Framework not found GoogleAppMeasurement" and when I checked it in details it looks like following: ld: framework not found

stackoverflow.com

pod파일에서 들어가서 파일을 직접적으로 가지고있어야만 손상이 안간다고한다.

아니면 그냥 icloud 범위밖으로 빼버리고 작업

 

난 그냥 빼버리고 작업하고있다.

반응형

오류 내용은 30개의 정의되지 않은 내용이 있다는 사항

"_OBJC_CLASS_$_APMAnalytics", 가 없다 뭐 가 없다  

내가 정의하지않은 부분이라 당황하면서도 클린도 해보고 껏다 켜보기도하고 해도 안되다가

 

결국 Pod update를 호출 하니 다시 돌아간다.

 

며칠인데도 뭔가 업데이트 사항이 있었나보다

 

이것도 안되면 그냥 pod로 깐 라이브러리들을 죄다 지우고 다시 설치해볼 생각이였으나 update로 해결되서 다행임.

반응형

요즘 노는 시간 도중도중 공부를 하고있는데

 

그 공부하고있는것중 ios용 키보드를 하나 만들고있다.

 

이곳에 쏟아 붇는시간이 얼마되지않아 진도가 많이 느리고 

 

처음에 제대로 공부하고 계획짜서 시작한게아니라 벌써 2번이나 갈아엎은 프로젝트이다.

 

기록을 살펴보니 최초일자가 5월19일

 

시작날짜만 보면 근 11일정도하고 영문키보드까진 됐는데

 

만들어야지 하고 이글 저글 스크랩만 해뒀던게 5월초부터니

 

근 한달간 공부는 키보드관련만 하고있었다

 

그렇게 근 한달정도된 프로젝트 진행 소스는 아래에 있다.

 

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

 

wiwi-git/FirstKeyboard

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

github.com

키보드 디자인은 최대한 기본 키보드UI에서 벗어나질 않으려고 했고

 

기본 키보드를 쓰면서 제일 불편했던 숫자부분과 특수문자부분을 바로 입력가능하도록한 프로젝트였으나

 

여기까지 만들어놓고보니

 

한글을 입력하면!

 

자음, 모음이 하나씩 들어간다

 

합쳐지질 않는다

 

 

몰랐다.

 

 

새로운걸 알게되서 좋긴하나

 

어떻게 해야할지 모르겠다

 

조합하는거 자체는 어느 고마우신분이 c#으로 작성해둔게 있어서 Swift 소스로 바꿨는데

이걸 어떻게 입력이 들어가야할지 막막해져서 

 

원래는 완성되면 올리려고한 포스트를 진행상황과 자모 합하는 함수 저장용으로 이 포스트를 남긴다.

 

아래 주소는 네이버 닉 골드러쉬님이 c#으로 12년도에 작성한 포스트이다.

m.blog.naver.com/goldrushing/130145910594

 

[C#] 한글 자음/모음 조합하기.

참조: 데브피아 (http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=17&MAEUL...

blog.naver.com

 

이걸 swift로 변환하면 이렇게된다.

 

let cho:[Character] = ["ㄱ","ㄲ","ㄴ","ㄷ","ㄸ","ㄹ","ㅁ","ㅂ","ㅃ","ㅅ","ㅆ","ㅇ","ㅈ","ㅉ","ㅊ","ㅋ","ㅌ","ㅍ","ㅎ"]

let jung:[Character] = ["ㅏ", "ㅐ", "ㅑ", "ㅒ", "ㅓ", "ㅔ", "ㅕ", "ㅖ", "ㅗ", "ㅘ", "ㅙ", "ㅚ", "ㅛ", "ㅜ", "ㅝ",
                        "ㅞ", "ㅟ", "ㅠ", "ㅡ", "ㅢ", "ㅣ"]
let jong:[Character] = [" ", "ㄱ", "ㄲ", "ㄳ", "ㄴ", "ㄵ", "ㄶ", "ㄷ", "ㄹ", "ㄺ", "ㄻ", "ㄼ", "ㄽ", "ㄾ", "ㄿ",
                        "ㅀ", "ㅁ", "ㅂ", "ㅄ", "ㅅ", "ㅆ", "ㅇ", "ㅈ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ"]
func hangle(c1:Character,c2:Character,c3:Character) -> Character? {
    var cho_i = 0
    var jung_i = 0
    var jong_i = 0
    for i in 0 ..< cho.count {
        if cho[i] == c1 { cho_i = i }
    }
    
    for i in 0 ..< jung.count {
        if jung[i] == c2 { jung_i = i }
    }
    
    for i in 0 ..< jong.count {
        if jong[i] == c3 { jong_i = i }
    }
    
    let uniValue:Int = (cho_i * 21 * 28) + (jung_i * 28) + (jong_i) + 0xAC00;
    if let uni = Unicode.Scalar(uniValue) {
        return Character(uni)
    }
    
    return nil
}

 

정확히 말하면 조금 변경했는데

변환이 안됐을때의 값을 nil값이 나오도록했고, 초성/중성/종성이 담긴 배열은 그냥 밖으로 빼버렸다.

 

분명 코드값 비교해가며 고민하신 소스일텐데 이렇게 공유해주시니 매우 감사할따름

 

 

반응형

아직도 왜 오류가 났는지 모르겠으나

테이블 생성시

id필드에 INTEGER PRIMARY KEY 그리고 AUTO_INCREMENT를 주었다.

 

결과...

생성이 되었는지 안되었는지 아마 안되었기에 뒤부분에서 계속 오류가 발생한거겠지

 

문서좀 뒤져보니 

PRIMARY KEY로 설정된애가 INTERGER일경우 자동으로 auto increment설정이 붙는다고한다

실제로 해당키워드를 지우고 돌려보니 무사히 돌아간다.

 

그리고 insert 문으로 데이터를 넣을시 id값도 무사히 잘 증가되어서 들어간다.

 

이전 그대로 소스를 돌려쓰고있는터라 

왜 이런문제가 발생했는지 아직도 모르겠다.

 

https://www.sqlite.org/autoinc.html

 

SQLite Autoincrement

1. Summary The AUTOINCREMENT keyword imposes extra CPU, memory, disk space, and disk I/O overhead and should be avoided if not strictly needed. It is usually not needed. In SQLite, a column with type INTEGER PRIMARY KEY is an alias for the ROWID (except in

www.sqlite.org

 

 

반응형

어느날 테스트를 하던도중 뭔지 잘모르겠으나

시뮬레이터상에서 화면전환 및 새로고쳐지는 애니메이션이 매우매우매우매우매우매우매우 느리게 보여진다.

뭔가 cpu사용량이 넘치는건가 싶어 다른시뮬레이터들을 전부끄고 하나만 돌려봐도 여전히 사태는 호전되지않는다

 

pc를 재부팅해도 이러한문제는 해결되지않았다.

 

검색도중 이러한글을 발견

https://stackoverflow.com/questions/35398356/how-to-speed-up-the-iphone-simulator-in-xcode/35398507#35398507?newreg=81dbb95772f34189b7f246555a57248e

 

How to speed up the iPhone simulator in Xcode

I'm using Xcode 7.2. When I build/run my app on device, all objects and images move according to the speed I set in the code, everything moves quickly. However, on iPhone simulator in Xcode, everyt...

stackoverflow.com

 

그러하다. 시뮬레이터의 디버그모드에서 

 

slow animation이라는 기능이 켜져있어서 생긴문제

 

아니 문제라기보단 그러한 기능

 

이러한기능이 있는지도 오늘처음알았다.

 

곧 퇴사일이 다가오는데 이러한 기본적인것도 모르고있으니 앞길이 막막하다

 

참고로 기능의 온오프는 아래 사진을 참고해라

 

반응형

+ Recent posts