IOS UIkit- 0

김정현·2023년 4월 10일
0

UIKit

목록 보기
4/14

property

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 프로퍼티가 메모리에 올라감 

Initializer

생성자

편의 이니셜라이저를 사용하면 중복되는 것을 제외하고 편하게 사용할 수 있다. 반드시 다른 이니셜라이저를 실행.

클래스는 이니셜라이저를 설정해주어야하고, 구조체는 이니셜라이저를 설정 안하고 호출할 시 스위프트가 자동으로 구조를 만들어줌

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번째 이니셜라이저가 활성화 됨 

Deinitialization

해제

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")
    }
}

struct

클래스는 참조 형태이기에 하나의 인스턴스가 모두 영향을 줌

But, 구조체는 상속불가, 서로 인스턴스가 영향을 주지않고 복제하는 개념임.

struct ImageType {
	var type = ""
}

var imagetype1 = ImageType()
var imagetype2 = ImageType1
var imagetype3 = ImageType2

//각자 인스턴스에 복제돼서 각자 다른 값을 가질 수 있음.   

Extension

기능확장


//짝수, 홀수 구분
extension Int {
	var oddOrEven: String {
    	if self % 2  == 0 {  //self는 Int를 뜻함
        	return "짝수:
        }
        return "홀수"
    }
}

3.oddOrEven    // 홀수 

protocol

규약, 규격, 규칙

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]

inheritance

상속
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()

generic

내가 정한 임의의 타입 <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    //구조체도 준수하게할 수 있음

higher order function

고차함수

맵은 원하는 스타일로 변경하지만 길이는 같다

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
}

0개의 댓글