class MyInfo {
//stored property 저장
var name = ""
var age =
//lazy stored property 사용하기위해 접근하는 순간 메모리에 올라감. (용량클때 유용, 분산효과)
lazy var myprofiles = [UIImage(named: "n", . . . . .]
//computed property(계산)
var isAdult: Bool {
// get{ (생략가능)
if age > 19 {
return true
}
return false
}
//email -> 보안 -> 암호화 된 값을 사용
var _email = "" //get set은 어디에 포함되어 있지 않기때문에 기억하기위해서
var email: String {
get{
return _email
}
set{
_email = newValue.hash.description //hash는 암호화라 가정
}
}
}
let myInfo = MyInfo()
myInfo.myprofiles //lazy 프로퍼티가 메모리에 올라감
생성자
편의 이니셜라이저를 사용하면 중복되는 것을 제외하고 편하게 사용할 수 있다. 반드시 다른 이니셜라이저를 실행.
클래스는 이니셜라이저를 설정해주어야하고, 구조체는 이니셜라이저를 설정 안하고 호출할 시 스위프트가 자동으로 구조를 만들어줌
class MyInfo {
var name: String
let myId: String
init(n: String, id: String) {
self.name = n
self.myId = id
}
init() {
self.name = ""
self.myId = "" //정해주던 받아오던 반드시 초깃값이 지정되어야함
//위 아래는 같은 코드임
// convenience initializer //필수조건 - 다른 init을 반드시 실행해야한다
convenience init() {
self.init(n: "", id: "")
}
}
var myInfo1 = MyInfo(n: "kim", id: "abcd")
var myInfo2 = MyInfo() //2번째 이니셜라이저가 활성화 됨
해제
var a: Int? = 10
a = nil
class Game {
var score = 0
var name = ""
var round: Round?
}
class Round {
var gameInfo: Game? //상호참조
var lastRound = 10
var roundTime = 20
init(){
print("game init")
}
deinit {
print("game deinit")
}
}
var game: Game? = Game() //game init
var round:Round = Round()
round?.gameInfo = game
game?.round = round
game = nil //상호참조 때문에 deinit이 되지않음
weak를 사용해 해결. Round는 Game이 없으면 의미 없기에 Game이 사라지는 시점에서 사라지게함
class Round {
weak var gameInfo: Game? //weak로 사라지게함
var lastRound = 10
var roundTime = 20
init(){
print("game init")
}
deinit {
print("game deinit")
}
}
클래스는 참조 형태이기에 하나의 인스턴스가 모두 영향을 줌
But, 구조체는 상속불가, 서로 인스턴스가 영향을 주지않고 복제하는 개념임.
struct ImageType {
var type = ""
}
var imagetype1 = ImageType()
var imagetype2 = ImageType1
var imagetype3 = ImageType2
//각자 인스턴스에 복제돼서 각자 다른 값을 가질 수 있음.
기능확장
//짝수, 홀수 구분
extension Int {
var oddOrEven: String {
if self % 2 == 0 { //self는 Int를 뜻함
return "짝수:
}
return "홀수"
}
}
3.oddOrEven // 홀수
규약, 규격, 규칙
protocol UserInfo {
var name: String{ get set } //name 을 가지고 있어야하고 get, set가능해야함
var age: Int { get set }
func isAdult -> Bool //내용은 기입하면 안 됨
}
extension UserInfo { //extension으로 상속과 비슷한 개념으로 프로토콜에 함수를 포함해 중복되는 것을 줄임
func isAdult() -> Bool {
if age > 19 {
return true
}
return false
}
}
class Guest: UserInfo {
var name: String = ""
var age: Int = 0
}
class Member: UserInfo {
var name: String = ""
var age: Int = 0
init(name: String, age: Int) {
self.name = name
*그 위 name임 *init에 name임
self.age = age
}
}
class VipMember: UserInfo{
var name: String = ""
var age: Int = 0
}
class UserInfoPresenter {
func present() {
let guest = Guest()
let member = Member(name: "jane", age: 25)
let vip = VIPMember()
}
}
프로토콜도 타입으로 받아서 사용이 가능하다.
let members: [UserInfo] = [guest, member, vip]
상속
super를 사용하면 부모클래스의 정보를 사용함
override가 없다면 기본적으로 super
class UserInfo {
var name = ""
var age = 0
func isAdult() -> Bool {
if age . 19 {
return true
}
return false
}
}
class Guest: UserInfo {
override func isAdult() -> Bool { //override로 수정
return true
}
func present() {
name = "kim"
print(name) //name은 기본적으로 부모클래스에서 받아옴
}
}
let guest = Guest()
guest.present()
내가 정한 임의의 타입 <Type>
//stack
struct IntStack<MyType> { //임의의 타입 설정
var items = [MyType]()
mutating func push(item: MyType) { //mutating 은 스스로를 변경할 수 있게 해줌
item.append(item)
}
mutating func pop() -> Mytype? {
if items.isEmpty == fasle {
return nil //데이터가 없으면 nil을 반환
}
return items.removeLast()
}
}
var myStack = InStack<String>()
myStack.push(item: "a") //"a"
where을 사용해 제네릭에 제한을 둘 수 있음
struct IntStack<MyType> where MyType: Numeric { //Numeric 숫자만 준수하게함
struct MyInfo: Numeric //구조체도 준수하게할 수 있음
고차함수
맵은 원하는 스타일로 변경하지만 길이는 같다
let names = ["kim", "lee", "min", "john"]
//map -> 원하는 스타일로 변경 ( 길이는 같다)
let names2 = names.map { name in
name + "님"
}
//위 아래 같은 코드
let names2 = names.map { $0 + "님" } //축약형
names2 //["kim님", "lee님", "min님", "john님"]
let names3 = names.map { name in
names.count
}
//[3, 3, 3, 4]
//compactMap -> nil 옵셔널 삭제
let numberArr = [ 1, 2, 3, 4,5, nil, 6, nil ,8]
let numbers = numberArr.compactMap { (num) in
return num
}
numbers
//[1,2,3,4,5,6,8]
//flatMap -> 꺼내는 개념
let numbers2 = [[1,2,3], [4,5,6,]]
let flatNum = numbers2.flatMap{ $0 }
flatNum
//[1, 2, 3, 4, 5, 6]
필터는 필요한 것만 거른다.
//filter
let filterNames = names.filter { (name) -> Bool in
name.count > 3
}
리듀스는 뭉치는 개념 + - , 통합
//reduce
let sumName= names.reduce("") { (firt, second) in
return first + second
}
//위 아래 같은 코드
let sumName = names.reduce("") {
$0 + $1
}