import Foundation
func hello(name: String) -> String {
return "Hello! " + name
}
let message = hello(name: "jay")
print("Hi~~")
print(124)
print(message)
func addTwoNumbers(num1: Int, num2: Int = 100) -> Int {
let sum = num1 + num2
return sum
}
addTwoNumbers(num1: 5, num2: 10)
addTwoNumbers(num1: 5)
func addNumbers(numbers: Int...) -> Int {
var sum = 0
for num in numbers {
sum += num
}
return sum
}
addNumbers(numbers: 1, 2, 3, 4, 5)
func myInfo() -> (name: String, weight: Int) {
return ("jay", 44)
}
let info = myInfo()
print(info.name)
print(info)
print(123, "Hello", true, 123.456, separator: "---", terminator: "")
func calculate(_ num1: Int, _ num2: Int) -> Int {
return num1 * num2
}
func calculate(devideFirstNumber num1: Int, bySecondNumber num2: Int) -> Int {
return num1 * num2
}
calculate(10, 10)
calculate(devideFirstNumber: 10, bySecondNumber: 10)
func add(num1: Int, num2: inout Int) -> Int {
num2 = 7
return num1 + num2
}
var test1 = 1
var test2 = 2
add(num1: test1, num2: &test2)
//test1은 복사, test2는 참조
//call by value
//call by reference
print(test2)
메모리 주소
: 값이 저장될 때 메모리 어딘가 저장되는데 그 어딘가가 주소임0
과 1
: bit
bit
는 2가지
라서 큰 의미가 없음1byte
: 8bit
0
~ 255
0x0
~ 0xff
0 == 0x0
255 == 0xff
65535 == 0xffff //2bytes 최대값
🌟 byte와 16진수는 찰떡 궁합임
🌟 2진수 데이터를 16진수로 간결하게 표현 가능
64bit
=> 8bytes
로 주소 표현0b1111 == 0xf
0b11111111 == 0xff
함수
, 변수
, 상수
를 관리class Circle {
//클래스는 프로퍼티에 초기값을 설정하지 않으면 에러남
var radius = 10.0//프로퍼티
let pi = 3.1415926535//프로퍼티
init() {//생성자에서 초기값 설정
radius = 10.0
}
init(radius: Double) {//생성자에서 초기값 설정
self.radius = radius//self 키워드는 프로퍼티를 가리킴, 파라미터와 구별지음
}
func area() -> Double {//메소드
return radius * radius * pi
}
}
//클래스를 동작시키려면 클래스의 인스턴스를 만들어야 함
let circle = Circle()//실제적으로 컴퓨터 메모리에 저장됨
//객체와 인스턴스 용어를 혼용하여 사용함
let c = Circle.init() // 생성자 함수
circle.area()
var w0 = 44
var w1 = Int.init(44)
var w2 = Int(44)//생성자는 생략가능
Int
자료형은 구조체var m0 = "Hello"
var m1 = String.init("Hello")
var m2 = String("Hello")
String
자료형도 구조체var nums0 = [2, 4, 6, 8]
var nums1 = [Int].init(arrayLiteral: 2, 4, 6, 8)
var nums2 = Array<Int>.init()//빈 배열
변수
, 상수
생성방법 : 리터럴
, 생성자
구조체
와 클래스
를 구분하는 중요한 특징class NoteBook {
var name = ""
func turnOn() {
print("Booting...")
}
}
class MacBook: NoteBook {
var hasTouchBar = true
var macOSVersion = "10.13"
override func turnOn() {
super.turnOn()//super 키워드는 슈퍼클래스의 인스턴스를 가리킴
print("\(name)'s current macOSVersion is \(macOSVersion)")
}
func turnOnTouchBar() {
}
}
let macBook = MacBook()
macBook.name = "MacBook Pro"
macBook.turnOn()
속성(프로퍼티)
정의메소드
정의생성자
를 통한 초기 설정extension
, protocol
사용 가능//소멸자를 통한 리소스 정리
class Circle2 {
var radius = 0
init() {
print("Initializer called")
}
deinit {
print("Deinitializer called")
}
}
if true {
var circle2 = Circle2()
}
Circle2
를 struct
로 바꾸게 되면 에러남class Circle3 {
var radius = 0
}
var c1 = Circle3()
var c2 = c1
c2.radius = 10
print(c2.radius)
print(c1.radius)
🌟 몇가지 간단한 데이터 값을 캡슐화
struct Rectangle {
var width = 0
var height = 0
}
struct Coordinate3D {
var x = 0
var y = 0
var z = 0
}
🌟 할당 및 전달 시 복사가 합리적일 때
🌟 모든 속성이 값 타입이라 - 복사
가 맞을 때
🌟 상속이 필요 없을 때
🌟 대부분의 경우는 클래스
switch
case
와 같이 사용하는 경우 많음enum AppleOS: Int {
case iOS = 0
case macOS
case tvOS
case watchOS
}
var osType: AppleOS = .watchOS //아니면 AppleOS.iOS
print(osType.rawValue)
func printAppleDevice(osType: AppleOS) {
switch osType {//열거형의 경우 디폴트 생략가능
case .iOS:
print("iPhone")
case .macOS:
print("iMac")
case .tvOS:
print("Apple TV")
case .watchOS:
print("Apple watch")
}
}
printAppleDevice(osType: .watchOS)
사용자
↔️ 응용프로그램(앱)
↔️ 운영체제
↔️ 하드웨어
🌟 iOS앱
아래는 4개의 프레임 워크 계층 시스템
:운영체제
가 가진것
🌟 Cocoa Touch
: UIKit, MapKit, Message UI
Media - Core Graphics, AVKit, Metal
🌟 Core Service
: Core Data, Foundation, Core Foundation
🌟 Core OS
, Kernel
: Accelerate, OpenCL, SystemConfiguration
🌟아이폰 하드웨어
접근 제어 | 모듈 내부 | 모듈 외부 |
---|---|---|
open | 접근가능 | 접근가능 |
public | 접근가능 | 접근가능 |
internal | 접근가능 | 접근불가 |
fileprivate | 같은파일 내 접근가능 | 접근불가 |
private | 접근불가 | 접근불가 |
모듈
: 하나의 코드
배포 단위접근 제어 | 모듈 내부 | 모듈 외부 |
---|---|---|
open | 상속 및 재정의 가능 | 상속 및 재정의 가능 |
public | 상속 및 재정의 가능 | 상속 및 재정의 불가 |
internal | 상속 및 재정의 가능 | 상속 및 재정의 불가 |
fileprivate | 상속 및 재정의 불가 | 상속 및 재정의 불가 |
private | 상속 및 재정의 불가 | 상속 및 재정의 불가 |
printLog
는 앱 배포 후는 확인할 수 없다는 단점이 있음NSLog
함수의 치명적인 단점 : 속도가 매우 느림통합 로그
에 대한 걸 발표함로그함수
를 중간중간에 넣으면 속도가 급격히 저하됨통합 로깅 시스템
Deployment Info
다양한 api 사용
에 제약이 걸림iOS market share
Application Programming Interface
인터페이스
: 사람과 컴퓨터/앱 간에 의사소통을 하기 위한 매개체API
를 통해 프레임워크
클래스에 접근해서 해당기능을 이용해 앱을 만드는 것os_log
도 하나의 api
인 것임통합 로깅
기능은 iOS 10
이상부터 사용가능