
https://codebeautify.org/jsonviewer

JSON

Swift
웹에서 정보를 주고받는 방법(아키텍처 스타일)
REST의 특징
- 리소스(resource)
- 인터넷에 존재하는 모든 정보(회원, 게시글 등)
- 예: /users/1 (1번 회원), /posts (게시글 전체)
- 주소(URI, URL):
- 리소스마다 주소가 있음
- 예: https://site.com/users/1
- 행동(HTTP 메서드):
- 어떤 행동을 할지 정하는 방법
- GET (가져오기), POST (생성), PUT (수정), DELETE (삭제)
- 1번 유저 정보 가져오기
- GET/users/1
- RESTful한 API 예
- GET /users → 회원 목록 보기
- GET /users/1 → 1번 회원 정보 보기
- POST /users → 새 회원 추가
- PUT /users/1 → 1번 회원 정보 수정
- DELETE /users/1 → 1번 회원 삭제
- RESTful하지 않은 예- 주소에 동작이 섞여 있음
- POST /users/getUser → 회원 정보 보기
- GET /users/deleteUser → 회원 삭제
일반적으로 서버에 요청하는 정보의 타입은 쓰기(Create), 읽기(Read),
수정(Update), 삭제(Delete) 로 구분되고, 네가지의 첫글자를 합쳐서
CRUD 라고 부름
URI 구성권고에 따르면 RESTful API 구성을 위한 URI에는 정보의 분류
체계만 포함되어야지, 정보를 어떻게 다룰 것인가 하는 동작에 관한 명세는
포함하지 않을 것을 권고함
URI 어떤 계층의 어떤 데이타라는 정보만 기재할뿐, 그 데이타를 읽을지 쓸지 등에 대한
액션 구분은 URI 에 나타내지 않음
권고안에서는 HTTP 메소드를 사용하여 이같은 액션을 구분해 줄 것을
권고함
RESTful API 형식으로 데이터를 제공하면, 서버에서 작성해 놓은 URI 명세에
따라 원하는 요청을 식별할 수 있도록 URI 를 구성하여 보내면 됨


시작 태그
끝 태그
빈 요소 태그
파싱(Parsing)
- XML데이터를 추출하여 분석
- 파싱을 처리하는 모듈을 파서(parser)라 함
장점
- 플랫폼 독립적
단점
- 마크업 태그를 사용하므로 데이터량 큼

name/value 형태의 쌍
- collection 타입
- 프로그래밍 언어에서 object, record, struct, dictionary (swift), hash table, 키가 있는 list 등
순서있는 값들의 리스트
- array(swift), vector, list, sequence
JSON객체(object)는 name/value 쌍들의 순서없는 SET
- object는 "{" 로 시작하고 "}" 로 끝냄
- 각 name 뒤에 ":"을 붙임
- ", "로 name/value 쌍을 구분
{ "이름": "김컴소", "나이": 20, "성별": "남" }
{ "이름": "김컴소",
"나이": 20,
"성별": "남",
"전화": {"휴대" :"010-1111-2222", "집" : "02-1111-2345"}
}

※ 모든 struct은 Codable 프로토콜을 준수해야 한다
일부 웹사이트에서 SOAP 프로토콜이나 RESTful 형식을 사용하여 공공 컨텐츠를 제공하는데 이를 오픈 API (Open API)라 함
https://github.com/dl0312/open-apis-korea
https://rapidapi.com/blog/most-popular-api/
https://data.seoul.go.kr/datasetRanking/popular.do
https://data.seoul.go.kr/ 활용사례(갤러리)



https://openapi.11st.co.kr/openapi/OpenApiFrontMain.tmall

https://developers.coupangcorp.com/hc/ko

https://developers.google.com/youtube/v3/getting-started?hl=ko




함수의 매개변수와 자료형을 지정해줘야 한다
swift에서는 반환값의 자료형도 지정함
https://docs.swift.org/swift-book/documentation/the-swift-programming-language/expressions/

https://en.wikipedia.org/wiki/First-class_citizen


func decideFun(x: Bool) -> (Int) -> Int {
if x {
return toUp
} else {
return toDown
}
}
func down(num: Int) -> Int {
return num - 1
}
func up(num: Int) -> Int {
return num + 1
}
func upDown(Fun: (Int) -> Int, value: Int) {
let result = Fun(value)
print("결과 = \(result)")
}
let toUp = up
let toDown = down
let r = decideFun(x: true)
print(up(num: 10))
print(toUp(10))
upDown(Fun: toUp, value: 10)
upDown(Fun: toDown, value: 10)
print(type(of: r))
print(r(10))

과제 부분의 출력 결과
(Int, Int) -> Int


- 예시
func mul(a: Int, b: Int) -> Int {
return a * b
}
let multiply = { (a: Int, b: Int) -> Int in
return a * b
}
print(mul(a: 10, b: 20))
print(multiply(10, 20))
let add = { (a: Int, b: Int) -> Int in
return a + b
}
print(add(10, 20))
func math(x: Int, y: Int, cal: (Int, Int) -> Int) -> Int {
return cal(x, y)
}
var result = math(x: 10, y: 20, cal: add) // return add(10, 20)
print(result)
result = math(x: 10, y: 20, cal: multiply) // return multiply(10, 20)
print(result)
result = math(x: 10, y: 20, cal: { (a: Int, b: Int) -> Int in
return a + b
}) // 클로저 소스를 매개변수에 직접 작성
print(result)
result = math(x: 10, y: 20) { (a: Int, b: Int) -> Int in
return a + b
} // trailing closure
print(result)


// 일반적인 클로저 정의 방식
let multiply = {(a: Int, b: Int) -> Int in
return a * b
}
var result = multiply(10, 20)
print(result)
func mul(a: Int, b: Int) -> Int {
return a * b
}
let result2 = mul(a:10, b:20)
print(result2)
// 변수에 클로저 할당
let add = {(a: Int, b: Int) -> Int in
return a + b
}
result = add(10, 20)
print(result)
// 함수를 이용한 클로저 전달
func math(x: Int, y: Int, cal: (Int, Int) -> Int) -> Int {
return cal(x, y)
}
result = math(x: 10, y: 20, cal: add)
print(result)
result = math(x: 10, y: 20, cal: multiply)
print(result)
// 클로저 소스를 매개변수에 직접 작성
result = math(x: 10, y: 20, cal: {(val1: Int, val2: Int) -> Int in
return val1 + val2
}) // 리턴형 생략
print(result)
result = math(x: 10, y: 20) {(val1: Int, val2: Int) in
return val1 + val2
} // trailing closure, 리턴형 생략
print(result)
result = math(x: 10, y: 20, cal: {
return $0 + $1
}) // 매개변수 생략하고 단축인자(shorthand argument name) 사용
print(result)
result = math(x: 10, y: 20) {
return $0 + $1
} // trailing closure, 매개변수 생략하고 단축인자사용
print(result)
result = math(x: 10, y: 20, cal: {
$0 + $1
}) // 클로저에 리턴값이 있으면 마지막 줄을 리턴하므로 return 생략
print(result)
result = math(x: 10, y: 20) { $0 + $1 } // return 생략
print(result)
/*
클로저가 함수의 마지막 argument라면 마지막 매개변수 이름(cal:)을 생략한 후 함수 소괄호 외부에 클로저를 구현
*/

https://developer.apple.com/documentation/uikit/uiviewcontroller/present(_:animated:completion:)
