블로그

22.12.31 학습일기

4. Numeric_1var myScore: UInt = 50myScore = 50var myScore1: UInt8 = 200200이라는 값의 2진수 값을 알고 싶을 경우!!String(myScore1, radix: 2(2진수여서), uppercase: false(true/ false 아무거나 ok))String(myScore1, radix: 2, uppercase: false) uppercase : true // 16진수 표현하고자 할 때 대문자로 표현uppercase : false // 16진수 표현하고자 할 때 소문자로 표현 Int8.max // 127Int8.min // -128UInt8.max // 255UInt8.min // 0// bit (binary, 2진수) 0 -> 1 -> 10// 3bit 000 -> 111// 4bit 0000 -> 1100// 8bit 00000000 -> 111111115. Numeric_2var myScore = 1_000_000 // 숫자 중간에 언더바 사용 가능, 시각적으로 보기 편함var myBit = 00010001 // 이대로 쓰면 10001만 인식 00010001라는 2진수로 인식하게 하려면?var myBit = 0b00010001 // 앞에 0b를 쓴다! 17이 저장됨var myBit = 0b0001_0001_1111 // 이때도 사용 가능 그럼 8진수는? -> 0o (0-7까지의 숫자만 사용 가능)var myBit = 0o10 // 8그럼 16진수는? -> 0xvar myBit = 0xf // 15var myBit = 0x10 // 16// reminder %var anyNumber = 9if (anyNumber % 2 == 0) {// 짝수} else {// 홀수}var number1 = 0.7var number2 = 0.2var sum = number1 + number2 // 0.89999999가 나옴, 0.9X WHY?0.7, 0.2도 2진수로 바뀌어서 계산되기 때문에 0.1101001010 + 0.110100010012진수 소수 계산 검색하여 알아보기0.9가 나오려면 어떻게 계산해?--> Decimal // 일반적으로 우리가 사용하는 0부터 9까지의 숫자 체계대로 계산하여 나타나게 해줌따라서 Decimal(sum)을 하면 0.9가 나옴6. Array_1Swift는 Array, Set, Dictionary 세 가지 Collection Type이 있음Collection Type이란, 데이터의 묶음, 데이터의 집합 느낌// Int Arrayvar numbers1 = [4, 5, 10, 23, 0, 4, 3, 2, 1]var numbers2: [Int] = [4, 5, 10, 23, 0, 4, 3, 2, 1]var numbers3: Array<Int> = [4, 5, 10, 23, 0, 4, 3, 2, 1]// 1 ~ 5var numbers4 = Array<Int>(1...5)var numbers5 = [Int](1..5)// 1, 1, 1, 1, 1var numbers6 = Array(repeating: 1, count: 5)// String Arrayvar strings = ["lee", "kim"]// Any Arrayvar anyArray: [Any] = [0, "lee"] // 타입이 여러 개 있을 때 Any타입 사용. but, swift 성격과 맞지는 않음, 안 쓸 수 있으면 안 쓰는 게 좋음// empty Array - 타입을 꼭 명시해야 함. 네 가지 모두 같은 의미var emptyArray1: [String] = [] // String 타입의 빈 배열 만들어짐var emptyArray2: [String] = Array() // 인스턴스화 한 것 -> 그래야 메모리에 올라가 사용 가능var emptyArray3 = Array<String>()var empryArray4 = [String]()7. Array_2// addvar numbers10 = [4, 5, 10, 23, 0, 4, 3, 2, 1]var numbers11 = [100, 200, 300]numbers10.insert(contentsOf: numbers11, at: 1) // 중간에 삽입, [4, 100, 200, 300, 5, 10, 23, 0, 4, 3, 2, 1]numbers10.append(contentsOf: numbers11) // 끝에 삽입, [4, 100, 200, 300, 5, 10, 23, 0, 4, 3, 2, 1, 100, 200, 300]numbers10.append(100) // [4, 100, 200, 300, 5, 10, 23, 0, 4, 3, 2, 1, 100, 200, 300, 100]numbers10.insert(500, at: 0) // [500, 4, 100, 200, 300, 5, 10, 23, 0, 4, 3, 2, 1, 100, 200, 300, 100]numbers10.insert(1000, at: 5) // [500, 4, 100, 200, 300, 1000, 5, 10, 23, 0, 4, 3, 2, 1, 100, 200, 300, 100]// removevar numbers20 = [4, 5, 10, 23, 0, 4, 3, 2, 1]let removeNumber = numbers20.remove(at: 4) // 삭제 된 값이 리턴되어 removeNumber에 저장numbers20.removeFirst()numbers20.removeLast()numbers20.removeFirst(2) // 앞에 두 개 삭제numbers20.removeLast(2) // 뒤에 두 개 삭제// replacevar numbers30 = [4, 5, 10, 23, 0, 4, 3, 2, 1] // readnumbers30.last // 마지막 인덱스의 값 읽어옴let lastIndex = numbers30.count - 1numbers30[lastIndex]8. Set_1Set은 순서도 없고, 인덱스도 없음, 중복 허용 안됨Array는 순서대로 접근 할 때 사용 // Set typevar number1: Set = [1,2,3,4,5] // {4, 3, 1, 5, 2}var number2: Set<Int> = [1,2,3,4,5] // {2, 5, 4, 3, 1}var number3 = Set([1,2,3,4,5]) // {1, 4, 2, 3, 5} // empty Setvar numbers4 = Set<Int>()var numbers5 : Set<Int> = [] // addnumbers1.insert(100) // (inserted true, memberAfterInsert 100)numbers1.insert(100) // (inserted false, memberAfterInsert 100) true와 false 값만 얻고 싶다면?numbers1.insert(100).inserted // truenumbers1.insert(100).inserted // false, 중복 허용되지 않기 때문에 // 덮어쓰기, update는 무조건 넣는 것,numbers1.update(with: 100) // 기존에 그 값이 있는지 없는지 값으로 알려줌, 100을 넣으려고 했는데 기존에 100이 있었다는 것을 보여줌numbers1.update(with: 1000) // 기존 값은 없다라는 것이 nil로 표시됨, nil은 아무것도 없다는 의미, 이 값은 numbers1에 들어감 // removenumbers1.remove(50) // 50이란 값이 numbers1에 없으므로 nil로 표시numbers1.remove(100) // 100numbers1 // {3, 1000, 1, 2, 5, 4} 내부적으로는 Set도 순서를 가지고 있다!!numbers1.firstIndex(of: 1000) // 1000의 인덱스 값 가져오기let setIndex = numbers1.firstIndex(of: 1000) // Set<Int>.index // numbers에 1000이 있으므로 1000의 index값이 setIndex에 저장numbers1.remove(at: setIndex!) // !(느낌표) 꼭 써야함, 이유는 나중에 설명9. Set_2let numbers1: Set = [1,2,3,4,5]let numbers2: Set = [4,5,6,7,8]// 합집합numbers1.union(numbers2) // {4,1,3,5,7,8,2}// 교집합numbers.intersection(numbers2) // {4,5}// 대칭차집합 (합집합-교집합)numbers1.symmetricDifference(numbers2) // {1,3,2,7,8,6}// 여집합numbers1.subtracting(numbers2) // {1,3,2} // numbers1에서 numbers2와 겹치는 원소 제외하고 나열numbers2.subtracting(numbers1) // {7,9,8} // numbers2에서 numbers1과 겹치는 원소 제외하고 나열// 한 쪽에 모두 포함 여부let numbers3: Set = [1,2,3,4,5]let numbers4: Set = [1,5]numbers3.isSubset(of: numbers4) // numbers3의 원소들이 numbers4에 포함되어 있는가? --> falsenumbers4.isSubset(of: numbers3) // numbers4의 원소들이 numbers3에 포함되어 있는가? --> truenumbers3.isSuperset(of: numbers4) // numbers4의 원소들이 numbers3에 포함되어 있는가? --> truenumbers4.isSuperset(of: numbers3) // numbers3의 원소들이 numbers4에 포함되어 있는가? --> false// 한 쪽에 모두 불포함 여부let numbers5: Set = [1,2,3,4,5]let numbers6: Set = [6,7]numbers5.isDisjoint(with: numbers6) // numbers5와 numbers6는 중복되어 있는 값이 하나도 없는가? --> truelet numbers5: Set = [1,2,3,4,5]let numbers6: Set = [6,7,5]numbers5.isDisjoint(with: numbers6) // numbers5와 numbers6는 중복되어 있는 값이 하나도 없는가? --> false10. Counted Set// NSCountedSet : 타입의 한 종류, 중복되서 누적되는 카운팅 개수를 셀 때 사용let colors: NSCountedSet = ["red", "orange", "blue"]colors.count(for: "red") // 1colors.add("red") // {"red", "orange", "blue"}colors.count(for: "red") // 2colors.add("red") // {"red", "orange", "blue"}colors.count(for: "red") // 311. Dictionarykey - valueSet과 같이 순서가 없음, key 중복 허락x, value는 중복 가능// 생성// emptylet names1 = Dictionary<String, String>() // [:]let names2 = [String : String]() // [:]let names3: [String : String] = [:] // [:]var names4 = ["cityA" : "Seoul" , "cityB" : "La"]names4.count // 2names1.isEmpty / true// 직접 입력 추가names4["cityC"] = "tokyo"names4["cityD"] = "baijing"names4.updateValue("Busan", forKey: "cityE")names3["cityE"] = "incheon"names3["cityF"] = "SF"// Dictionary + Dictionary, cityE가 중복되므로 return 값에 따라 한쪽 cityE는 지워짐let mergingDic = names3.merging(names4) { leftValue, rightValue in return letfValue}// leftValue, rightValue는 개발자가 임의로 지은 이름. 보통은 current, new으로 씀, leftValue는 names3를, rightValue는 names4를 의미// return letfValue하면 names3에 있는 cityE : incheon이 남음// return rightValue하면 names4에 있는 cityE : Busan이 남음// 삭제names3 // ["cityE" = "incheon"], ["cityF" = "SF"]names3["cityF"] = nillnames3.removeValue(forKey: "cityF")// 두 개 같은 의미names3 // ["cityE" = "incheon"]// 업데이트names3["cityE"] = "hawaii"12. TupleTuple은 ()안에 들어 있음, 삭제, 추가할 수 없음var someTuple1 = (100, "kim", false)someTuple을 타입 추론하면 someTuple: (Int, String, Bool)==> 첫 번째 값은 Int, 두 번째 값은 String, 세 번째 값은 Bool 타입의 값이 들어가야 함// 생성var someTuple2 = (score : 100, userName : "kim", isShowName : false)var someTuple3: (String, Int) = ("lee", 50)// 조회someTuple.0 // 100someTuple2.score // 100let (score, name, isShowName) = someTuple1 // let 대신 var도 사용 가능score // 100name // "kim"isShowName // false// 업데이트someTuple2.score = 50 // 50someTuple2 // (score : 50, userName : "kim", isShowName : false) 

모바일 앱 개발학습일기swiftiOS

23.01.08 학습일기

19. ControlFlow - for inlet names = ["kim", "lee", "min"]let numbers = [1,5,3,35,3,65]for name in names { // in names => 3번 반복print(name) // "kim", "lee", "min"가 출력}for number in numbers { // in numbers => 6번 반복print(number) // 1,5,3,35,3,65가 출력} let myRange1 = (0...5)let myRande2 = (0..<6)for number in myRange1 {print(number) // 0부터 5까지 출력}인덱스 값까지 가져오고 싶다!=> for (index, name) in names.enumerated(){print(name, index)} // index도 같이 출력됨하나 씩 늘어나는 값 말고 5분 간격으로 뛰어 넘고 싶다!=> let minute = 60for minute in 0..<minutes {if minute % 5 == 0 {print(minute)}} // 60번 반복, 0부터 59까지 5분 간격으로 출력됨위의 방식과 같은 방식// 0..<minutesfor minute in stride(from: 0, to: minute, by: 5) { // from: 시작, to: 끝(포함x), by: 간격print(minute)} // 12번 반복, 이게 더 효율적. 0부터 59까지 5분 간격으로 출력// 0...minutesfor minute in stride(from: 0, through: minute, by: 5) { // from: 시작, to: 끝(포함o), by: 간격print(minute)}20. ControlFlow - while// while은 반복 끝이 정해지지 않을 때 사용// 주사위 (1~6)// 주사위 홀수 -1// 주사위 짝수 +2// 목표 10까지 도달var dice = 0 // 랜덤하게 나오는 주사위 번호var myPosition = 0while myPosition < 10 {dice = Int.random(in 1...6) if dice % 2 ==0 {myPosition += 2}else if myPosition > 0 {myPosition -= 1}print("dice", dice, " position", myPosition)}print("end")21. ControlFlow - switchvar number = 14switch number {case 3:print("삼")case 10...100:print("십~백")case 5, 7:print("오, 칠")default:print("기타 숫자")} var someString = "e"switch someString {case "a":print("삼")case "c"..."f":print("씨~에프")case "g", "z":print("쥐, 지")default:break // 빠져 나감//print("기타 문자")}  // switch case let : 이름을 지정하여 해당되는 값을 받아와 그 값으로 무언가를 하고 싶을 때 사용let media = ("abc음악", 180)switch media {case let (title, length):print("제목", title)print("길이", length)} // 제목 abc음악길이 180으로 출력 ==> 만일 하나의 값만 쓰고 싶다면? let media = ("abc음악", 180)switch media {case let (title, _):print("제목", title)} // 제목 abc음악만 출력22. Function_1// 파라미터에 하나의 값func presentMyScore(score: Int) {print(score.description + "점") // String 형으로 변환. 변환을 해야 숫자가 화면에 찍힘}presentMyScore(score: 50)-----------------------------------------------// 파라미터에 두 개의 값func presentScore(myScore: Int, yourScore: Int) {print(myScore.description + " vs " + yourScore.description)}func presentScore(myScore: 80, yourScore: 100)-----------------------------------------------// function returnfunc plus(numver1: Int, number2: Int) -> Int {return number1 + number2}let sumResult = plus(numver1: 50, number2: 30)print(sumResult)-----------------------------------------------// 파라미터가 없는 경우func printHello() {print("Hello")}printHello() + "안녕"-----------------------------------------------// multiple return valuesfunc scoreList() -> [Int] {return [50, 30, 60]}scoreList()func scoreList2() -> (eng: Int, music: Int) {return (50, 80)}scoreList2().engscoreList2().music-----------------------------------------------// argument lables, parameter name - 다른 이름을 사용하고 싶을 때func sumNumber1(num number1: Int, num number2: Int) {number1 + number2 // 이 때는 뒤에 이름 씀}sumNumber1(num: 80, num: 80) // 이 때는 앞에 이름 씀// 딱히 이름을 쓰지 않아도 될 때func sumNumber1(_ number1: Int, _ number2: Int) {number1 + number2 // 이 때는 뒤에 이름 씀}sumNumber1(50, 100)-----------------------------------------------// In-Out parameters// Inputvar myScore = 60func plusFive() {myScore += 5}myScore // 60plusFive() // 이것만 봐서는 무엇을 +5 한다는 것인지 모름myScore // 65 ==> 함수의 용도를 직관적으로 파악하고 싶을 때!// In-Out parameters// inout func plusNewFive(score: inout Int) {score += 5} plusNewFive(score: &myScore) // 70myScore // 70----------------------------------------------------------------------------------22. Function_2// Function Typesvar someString: String = ""func sayHello() {print("hello")}sayHello // () -> ()// () -> void와 같음func plus(a: Int, b: Int -> Int) {return a+b}func minus(a: Int, b: Int -> Int) {return a-b}let inputValue1 = 4let inputValue2 = 5func selectSymbolButton(buttonStyle: String) { // 함수가 무슨 기능 하는지 이름 정확하게 설정하기!!!if buttonStyle == "+" {plus(a: inputValue1, b: inputValue2)} else if buttonStyle == "-" {minus(a: inputValue1, b: inputValue2)}}// 위의 경우는 실행까지 완료하는 경우. 실행하지 않고 기능을 담기만 하는 방법은?// Optional 사용!var calc : ((Int, Int) -> Int)?func selectSymbolButton2(buttonStyle: String) {if buttonStyle == "+" {calc = plus // calc에 plus기능을 담기만 함. 실행x} else if buttonStyle == "-" {calc = minus // calc에 minus기능을 담기만 함. 실행x}}func showResult() {calc?(inputValue1, inputValue2) // ? 꼭 붙여야 함!!} // "="를 눌렀을 경우와 같이 미리 담아둔 함수 기능을 여기서 실행!!!

모바일 앱 개발학습일기swiftiOS

23.01.03 학습일기

15. Optional_3// if let(var)// guard let(var)var myAge1: Int? = 20var myAge2: Optional<Int> = 40myAge1이 nil이 아닐 경우, 그냥 Int 값으로 처리 가능따라서, myAge1은 unwrapping 가능var sum = 0if let age = myAge1 { sum+age+1 // 21} 그러나, myAge1이 nil일 경우, myAge1은 unwrapping 할 수 없기 때문에 연산 불가var sum = 0myAge1 = nil // nilif let age = myAge1 { sum+age+1 // 21} // 0if let(var)과 형식은 똑같은데 동작되는 방식이 다른 것 = guard let(var)guard let age = myAge1 else { // 값을 가져오지 못했을 때 // guard 문은 중단시키고자 할 때 사용 return // 해당되는 코드블럭 끝남을 의미 //fatalError("여기는 nil이 나오면 안 되는 부분입니다.") // 앱 자체를 종료시키면서 에러 표시를 나타내는 기능, 왜 에러 발생했는지 써주기}age // age 가져왔을 때 처리는 밑에 씀16. Operators_1var (age1, age2) = (10, 20)let newStr = str1 + " " + str2var arr1 = ["a", "b", "c"]var arr2 = ["d", "e", "f"]var newArr = arr1 + arr2 // 배열도 합치기 가능, ["a", "b", "c", "d", "e", "f"]// String이나 Array 같은 경우 타입 같으면 +연산 했을 때 이어붙여서 출력됨//Remainder Operator 나머지 값 알려주는 연산자 % -> Int 타입만 가능!!!var num1 = 8var num2 = 3num1 % num2 // 2// Double 타입var num3: Double = 8var num4: Double = 3num3.truncatingRemainder(dividingBy: num4) //2!! num3.remainder(dividingBy: num4) // -1이 나옴 => why?==> num3 / num4를 하면 2.66666이 나오는데, 몫은 가까운 정수로 표현되여 3이 된다.이 때, 3X3(num4)=9가 되어 8(num3)보다 1이 커지므로, -1이 출력된다.17. Operators_2var a = "a"var b = "b" // 문자 - 대소 비교 가능if a>b { print("true")}else { print}// Range Operator// 범위 0...5for index in 0..<5 { print(index)}let names = ['"kim", "lee", "min"]for index in 0..<names.count) { print(names[index]}for name in names { print(name) // 범위 지정 하지 않아도 처음부터 끝까지 도는 것}for name in names[1...] // 1부터 끝까지 쓴다는 의미for name in names[...3] // 처음부터 3까지 쓴다는 의미&& AND|| OR.toggle()은 해당 성질을 반대로 바꿔버림 - 원본 자체가 바뀜isGreen.toggle() - falseisGreen - false18. Unicode// 문자 -> 내부적으로 특정한 코드 값(16진수)\u안에 코드 값 넣으면 유니코드 나옴"a""\u{61}" // "a""가를" 유니코드로 변경하고 싶다면?UnicodeScalar("가") // 44032-But 이것은 10진수유니코드는 16진수이기 때문에, 44032를 16진수로 바꾸기 위해서는?String(44032, radix: 16) // AC00// 숫자만 입력let inputValue = "ㄱ"if inputValue >= "\u{30}" && inputValue <= "\u{39}" // 0 에서 9 { print("숫자")} else{ print("숫자 아님")}// 한글만 입력UnicodeScalar("가") // 44032String(44032, radix: 16) // ac00UnicodeScalar("힣") // 55203String(55203, radix: 16) // d7a3if inputValue >= "\u{ac00}" && inputValue <= "\u{d7a3}" // 0 에서 9 { print("한글")} else{ print("한글 아님")}

모바일 앱 개발학습일기iOSswift모바일앱개발

23.01.02 학습일기

13. Optional_1Optional type이란?값이 있을 수도, 없을 수도 있음. 타입에 ?를 붙임. 모든 타입은 Optional type 가능값이 없다라는 개념은 - nil로 표현 (null) - 어떤 상태인지 모른다는 뜻var age: Int? = 100 // 값을 넣어도 되지만var age1: Int? = nil // 값이 없다. nil을 쓰는 것이 더 맞는 표현. 메모리에 아직 올라가지 않은 상태를 말함var age2: Int = 0과 다른 의미임!!! 값이 있는 상태if age1 == nil {// print("나이가 0살이다") - 틀림print("나이 값을 확인할 수 없다.)}var str1: String = "" // 값이 있음var str2: String? = nil // 값이 없음if str2 == nil {//print("글자 개수가 0개이다") - 틀림print("글자를 쓰지 않았다. 스트립 값이 어떤 지 모른다)}var myfavorite: [String]? // String 타입의 Optional 배열, 초기 값 안 주면 nil로 처리됨if myfavorite == nil {// print("내 즐겨찾기 개수가 0개다") - xprint("내 즐겨찾기 개수를 받아오는데 실패했습니다.")}14. Optional_2// unwrapping// 옵셔널로 래핑(wrap) 되어 있다.var myAge1: Int = 20var myAge2: Optional<Int> = 40var sum = myAge2 + 1 // error. unwrapped 해야 함. 옵셔널이 되는 것이 있고 안 되는 것이 있는데, +는 Optinal로 사용할 수 없는 기능// force unwrapping (강제로 unwrapping 하는 것, ! 붙이기)var sum = myAge2! + 1// 주의 사항myAge = nilmyAge! // error. 앱이 죽은 상태. 절대 하면 안됨var sum2 = (myAge1 ?? 0) + 1 // myAge1이 nil일 경우 0으로 대체하여 사용하겠다는 뜻

모바일 앱 개발학습일기iOSswift모바일앱개발

채널톡 아이콘