Jessi :D

Language/Swift-Basic

Language/Swift-Basic

Swift - 고차함수 sort, sorted

변수선언 // 배열을 변수로 선언 var myArray = [1,2,3,4,5,6,7,8,9,10] sorted() sorted를 통해 오름차순으로 정렬된 새 콜렉션을 반환 var filteredArray = myArray.sorted() myArray // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] filteredArray // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 콜렉션 내의 데이터들을 번갈아 가면서 돌아, 반환 값이 true가 나올 때 해당하는 값을 넣음. 그래서 내림차순으로 정렬이 됨 var descandingArray = myArray.sorted(by: { (someValue:Int, otherValue:Int) -> Bool in return someValu..

Swift - 고차함수 (Higher Order Functions)

매개변수로 함수 혹은 클로저를 받고, 받았던 녀석을 반환하는 함수 콜렉션에 들어가는 배열, 딕셔너리, 셋에 Sorted, Map, Filter, Reduce 등이 빌트인 되어있다. 함수 getName → 메소드인데 매개변수로서 클러저를 받고 그 클로저를 반환하는데, 반환하면서 형태를 변환하거나 한다. func getName(_ name: String) -> String { return "내 이름은 \(name)" } // 함수 자체를 매개변수로 넣고 func sayHello( getName: (String) -> String, name: String) -> String { // 넣은 함수를 반환 return getName(name) } let resultOne = sayHello(getName: getN..

Swift - lazy 키워드

Struct Pet struct Pet { init(){ print("Pet이 생성되었다.") } } 일반 Struct Friend class, struct 동일하게 적용됨. struct Friend { var name: String // 펫을 맴버 변수로 가진다. var pet : Pet = Pet() // 생성자 메소드 init(_ name: String) { self.name = name print("Friend가 생성됨") } } Friend 호출 var myFriend = Friend("만쥬") print("myFriend : \(myFriend.name)") // myFriend : 만쥬 결과 Pet이 생성되었다. Friend가 생성됨 myFriend : 만쥬 lazy Struct Pet st..

Swift - typealias

typealias 별칭을 통해 프로토콜 별명 설정 가능 protocol Naming { func getName() -> String } protocol Aging { func getAge() -> Int } 별명설정 typealias Friendable = Naming & Aging struct Friend : Friendable { var name : String var age : Int func getName() -> String { return self.name } func getAge() -> Int { return self.age } } 클로저 // 클로저를 StringBlock 이라는 별명으로 설정 typealias StringBlock = (String) -> Void //func sayHi..

Swift - 프로토콜 associatedType

associatedtype 을 통해 제네릭으로 어떠한 자료형이든 가질수 있다 Protocol 애완동물 관련 프로토콜 protocol PetHaving { associatedtype T // 애완동물 배열 var pets: [T] { get set } // mutating을 통해 스트럭트에서 멤버 변수 값변경 mutating func gotNewPet(_ newPet: T) } ※ mutating - 포스트 바로가기 Extension 익스텐션으로 프로토콜의 메소드 로직 구성 extension PetHaving { mutating func gotNewPet(_ newPet: T) { self.pets.append(newPet) } } Enum enum Animal { case cat, dog, bird } ..

Swift - 프로토콜 확장

프로토콜 자체에서는 로직을 추가할 수 없으므로 익스텐션 확장을 이용해 메소드 추가함 프로토콜 이름관련 프로토콜 protocol Naming { var lastname: String { get set } var firstname: String { get set } func getName() -> String } 익스텐션 익스텐션 확장으로 메소드 추가 extension Naming { func getFullName() -> String { return self.lastname + " " + self.firstname } } 스트럭트 Naming 프로토콜을 임플레먼트하는 스트럭트 struct Friend : Naming { var lastname: String var firstname: String func ..

Swift - 프로토콜 상속

프로토콜 자체는 자신의 인스턴스는 만들지 못한다. 프로토콜을 임플리먼트하면 해당 프로토콜의 변수나, 메소드의 설정이 강제된다. 프로토콜도 상속해서 사용이 가능하다. 프로토콜 선언 // 이름 protocol Naming { // get set 을 통해 이름을 성정하고 가져올수 있다. var name: String { get set } func getName() -> String } // 나이 protocol Aging { var age: Int { get set } } 상속 이름, 나이 프로토콜을 상속하는 친구 프로토콜 protocol UserNotifiable : Naming, Aging { } 스트럭트 친구 프로토콜을 임플레먼트하는 MyFriend 스트럭트 struct MyFriend: UserNoti..

Swift - 프로토콜

약속 보통 delegate 패턴의 경우에는 **delegate, 스위프트 언어자체에서는 **ing, **able 등으로 프로토콜의 이름을 정함 프로토콜약속 프로토콜을 통해 맴버변수, 메소드 등을 꼭 구현하도록 강제 protocol Naming { // 우리는 이런 변수를 가지고 있을겁니다. 라고 약속 var name : String { get set } // 우리는 이런 메소드를 가지고 있을겁니다. 라고 약속 func getName() -> String } Nameing 프로토콜을 임플레먼트 했기 때문에 struct myName : Naming { // name 맴버 변수를 설정하지 않으면 에러 var name: String // getName() 메소드 설정 안하면 에러 func getName() ->..

Swift - 스트럭트 메소드

Struct에서도 메소드를 가질수 있고, 멤버 변수들 활용이 가능하다. struct Friend { var age : Int var name : String // 입력 가져오는 메소드 func sayHello() -> String { return "저는 \(age)살, \(name) 입니다." } } var myFriend = Friend(age: 100, name: "만쥬") myFriend.sayHello() // 저는 100살, 만쥬 입니다.

Swift - Set

콜렉션 중 하나인 Set set → 고유 배열과 비슷하지만... 배열처럼 중복으로 값을 넣을수 없다. 아무리 넣어도 고유한 값만 남는다. 순서가 정해져 있지 않다. 매번 출력되는 값들의 순서가 다르다. insert var myNumberSet = Set() var myNumberSet : Set = Set() myNumberSet.insert(1) //(inserted true, memberAfterInsert 1) myNumberSet.insert(2) //(inserted true, memberAfterInsert 2) myNumberSet.insert(2) //(inserted false, memberAfterInsert 2) myNumberSet.insert(3) //(inserted true, ..

Swift - 스트럭트 Mutating

class 는 참조, struct 는 값 Class 클래스는 참조이기 때문에 주소 값이 다르므로 name을 받을 수 있다. class Friend { var name : String func changeName(newName: String) { self.name = newName } init(_ name: String) { self.name = name } } var myFriend = Friend("만쥬") myFriend.name // 만쥬 myFriend.changeName(newName: "개발하는 만쥬") myFriend.name // 개발하는 만쥬 Struct struct는 값이으로 name을 받을 수 없다. mutating을 사용하여 name값을 받을 수 있다. struct BestFrien..

Swift - 에러

자료형이 Error인 enum 에러를 enum 타입으로 작성할 수 있다. enum MismathError: Error { case nameMismatch case numberMismatch } 에러 던지기메소드 반환형 없음 func guessMyName(name input: String) throws { // 매개변수로 받은 이름이 '만쥬' 일치하지 않으면 if input != "만쥬" { print("guessMyName : 틀렸다") // 이름 미스매치 에러를 던진다, 보낸다. throw MismathError.nameMismatch //return } print("guessMyName : 맞췄다") } 에러호출 안함 // 에러를 처리하지 않음 try? guessMyName(name: "만슈") 에러..

Swift - 매소드 매개변수

메소드 매개변수 name을 받는 메소드 _ 언더바를 넣어 메소드 호출시에 이름 안써도 됨 func sayName(_ name: String) { // 받은 매개변수를 이용해 프린트로 출력 print("안녕? \(name) 라고 해") } sayName("만쥬") // 안녕? 만쥬 라고 해 inout 메소드에 매개변수로 들어오는 값은 변경 할 수가 없다, 하지만, inout 키워드를 이용하면 값 변경 가능 func sayHi(_ name: inout String) { name = "개발하는 " + name print("안녕? \(name) 라고 해") } 변수선언 inout 메소드에 들어가는 값은 자체가 상수이기 때문에, 메소드에 바로 값을 넣지 못한다. 값이 변경 가능해야 되기 빼문에 변수에 값을 한번 ..

Swift - 파이널 클래스

final 키워드로 다른 클래스가 상속받지 못함 정상 상속 코드 class Friend { var name : String init(name: String) { self.name = name } } class BestFriend : Friend { override init(name: String) { super.init(name: "베프" + name) } } let myFriend = Friend(name: "철수") myFriend.name // 철수 let myBF = BestFriend(name: "수잔") myBF.name // 베프수잔 파이널 코드 // final 키워드로 다른 클래스가 상속받지 못함 final class Friend { var name : String init(name: St..

Swift - 딕셔너리

Dictionary 키 : 값 한 쌍으로 가지고 옴 정렬되지 않은 컬렉션 - print 하면 순서 없이 뒤죽박죽 출력 됨 빈 딕셔너리 생성 let emptyDictionary : [String : Int] = [:] let emptyDictionary2 : [String : Int] = [String : Int]() let emptyDictionary3 = [String : Int]() let myEmptyDic : [String : Int] = Dictionary() let myEmptyDic2 = Dictionary() myFriend 선언 변수 선언 // 변수 선언 var myFriends = ["friend_1" : "만쥬", "friend_2" : "영희"] 값 꺼기 let myBF1 = myF..