์ „์ฒด ๊ธ€

๐ŸŒฑiOS ๊ฐœ๋ฐœ์ž๋ฅผ ๊ฟˆ๊พธ๋Š” ํ•™์ƒ์ด ๋งŒ๋“œ๋Š” ๋ธ”๋กœ๊ทธ
ยท๐ŸŒฑ SeSAC
IBInspectable, IBDesignable ์Šคํ† ๋ฆฌ๋ณด๋“œ๋กœ ์ž‘์—…์„ ํ•˜๋‹ค๋ณด๋ฉด ์ธ์ŠคํŽ™ํ„ฐ์—์„œ ์†์„ฑ๊ฐ’์„ ์กฐ์ •ํ•˜๋Š” ์ผ์ด ๋งŽ์€๋ฐ ํ•˜๋‚˜ ๊ฐ€์žฅ ๊ท€์ฐฎ์•˜๋˜ ๊ฒƒ์€ border ๊ฐ’์„ ์„ค์ •ํ•˜๋Š” ๊ฒŒ ๊ธฐ๋ณธ์ ์œผ๋กœ ์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. border ๊ฐ’์„ ๋งค๋ฒˆ ์ฝ”๋“œ๋กœ ๋ช‡ ์ค„์”ฉ ์งœ๋Š” ๊ฒƒ๋ณด๋‹ค ์ธ์ŠคํŽ™ํ„ฐ ์ฐฝ์—์„œ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์–ผ๋งˆ๋‚˜ ์ข‹์„๊นŒ? IBInspectable๊ณผ IBDesignable ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์ด์šฉํ•˜๋ฉด ๊ทธ๊ฒƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค ๋นŒ๋”์—์„œ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ฐ์ฒด์— ์†์„ฑ์„ ์ ์šฉํ•˜๊ณ  ํ™•์ธ ๊ฐ€๋Šฅ ๋Ÿฐํƒ€์ž„์ด ์•„๋‹ˆ๋ผ ์ปดํŒŒ์ผ ํƒ€์ž„์— ํ™•์ธ ๊ฐ€๋Šฅ ๋ฐ”๋กœ ๋ฐ˜์˜์ด ์•ˆ ๋  ์ˆ˜ ์žˆ์Œ // ์ธํ„ฐํŽ˜์ด์Šค ๋นŒ๋” ์ธ์ŠคํŽ™ํ„ฐ ์˜์—ญ Show @IBInspectable var cornerRadius: CGFloat { get { return layer.cornerRa..
ยท๐ŸŒฑ SeSAC
์ƒ์ˆ˜ ๊ด€๋ฆฌ, API Key ๊ด€๋ฆฌ enum ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๋ถˆ๊ฐ€ case rawValue โ†’ ์ค‘๋ณต ๋ถˆ๊ฐ€ static let โ†’ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์ ‘๊ทผ, ํ•œ ๋ฒˆ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ๊ฐ€๋ฉด ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋‚จ์•„์žˆ์Œ struct ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๊ฐ€๋Šฅ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์„ ๋ง‰์œผ๋ ค๋ฉด init()์„ privateํ•˜๊ฒŒ ์ œ์–ดํ•ด์ฃผ๋ฉด ๋จ URL Endpoint ๋ถ„๋ฆฌํ•˜๊ธฐ ์˜ˆ์ „์—๋Š” ๋‹จ์ˆœํ•˜๊ฒŒ ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋ฅผ ์ด์šฉํ•ด์„œ ์ƒ์ˆ˜ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ URL์„ ๊ด€๋ฆฌํ–ˆ์—ˆ๋Š”๋ฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด enum์„ ์ด์šฉํ•ด์„œ๋„ URL์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค. Endpoint๋กœ ํŒŒ์ผ๋ช…์„ ์ง“๋Š” ๊ฒƒ์€ ์ข‹์€ ๊ฒƒ ๊ฐ™๋‹ค. Moya๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, Alamofire ๋˜๋Š” URLSession์„ ๋ชจ๋“ˆํ™”ํ•ด์„œ ์‚ฌ์šฉํ•  ๋•Œ๋„ Endpoint๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  URL์„ ๊ด€๋ฆฌํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. enum En..
ยท๐ŸŒฑ SeSAC
ํด๋กœ์ € ํ•จ์ˆ˜์˜ ํ˜•ํƒœ์™€ ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ ๊ตฌ์กฐ๋ฅผ ์ž˜ ์ดํ•ดํ•œ๋‹ค๋ฉด ์‰ฝ๊ฒŒ ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค. // ๋‹ค์Œ๋„ ์ž˜ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ํด๋กœ์ €์˜ ์ดํ•ด๋ฅผ ๋„์šธ ์ˆ˜ ์žˆ๋‹ค. func example() {} example // ํ•จ์ˆ˜ ์ž์ฒด example() // ํ•จ์ˆ˜ ํ˜ธ์ถœ ํด๋กœ์ € ๊ธฐ๋ณธ ๊ตฌ์กฐ ํด๋กœ์ € ํ—ค๋”์™€ ํด๋กœ์ € ๋ฐ”๋”” ๋ถ€๋ถ„์„ ์ž˜ ์ดํ•ดํ•˜์ž. { (๋งค๊ฐœ ๋ณ€์ˆ˜) -> ๋ฆฌํ„ด ํƒ€์ž… in// ํด๋กœ์ € ํ—ค๋” ์‹คํ–‰ ๊ตฌ๋ฌธ// ํด๋กœ์ € ๋ฐ”๋”” } ์ธ๋ผ์ธ ํด๋กœ์ € (inline closure) // ์ฝ”๋“œ๋ฅผ ์ƒ๋žตํ•˜์ง€ ์•Š๊ณ  ํด๋กœ์ € ๊ตฌ๋ฌธ ์”€, ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋‚ด์— ํด๋กœ์ €๊ฐ€ ๊ทธ๋Œ€๋กœ ๋“ค์–ด๊ฐ„ ํ˜•ํƒœ // => ์ธ๋ผ์ธ ํด๋กœ์ € getStudyWithMe(study: { () -> () in print("์ฃผ๋ง์—๋„ ๊ณต๋ถ€ํ•˜๊ธฐ") }) ํŠธ๋ ˆ์ผ๋ง ํด๋กœ์ € (trailing clo..
ยท๐ŸŒฑ SeSAC
์„œ๋ฒ„ ํ†ต์‹  ์‹œ ์…€์— ๋ณด์—ฌ์ค„ UIImage ๋ณ€ํ™˜ ์‹œ์  urlString โ–ถ๏ธ url โ–ถ๏ธ image url๋กœ ๋ฐ”๊พธ๊ณ  ๋˜๋Š” image๋กœ ๋ฐ”๊พธ๋Š” ๊ณผ์ •์„ ์–ด๋””์—์„œ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„๊นŒ? ์„œ๋ฒ„ ํ†ต์‹  ์‹œ์ ์—์„œ ํ• ์ง€ => ์‹œ๊ฐ„์ด ์˜ค๋ž˜๊ฑธ๋ฆฌ๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š” ์ •๋ณด์— ๋Œ€ํ•ด์„œ๋„ ์ž‘์—…์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์„œ ๋น„ํšจ์œจ์  ์…€์—์„œ ์ฒ˜๋ฆฌํ• ์ง€ => ์กฐ๊ธˆ ๋” ์ ์ ˆํ•ด๋ณด์ธ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์„œ๋ฒ„ ํ†ต์‹ ์„ ์…€์—์„œ ํ•  ๊ฒฝ์šฐ ์…€์ด ๊บผ๋‚ด์งˆ ๋•Œ๋งˆ๋‹ค ์š”์ฒญ์ด ๋“ค์–ด๊ฐ€ call ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. Alamofire์˜ ๋ฐ์ดํ„ฐ ๋ฐ›์•„์˜ค๋Š” ๋ฉ”์„œ๋“œ(Response Handler) // Response Handler - Unserialized Response func response(queue: DispatchQueue = .main, completionHa..
ยท๐ŸŽ iOS & Swift
๋ณธ ๊ธ€์€ WWDC ๋ฅผ ๋ณด๊ณ , ๋ฒˆ์—ญ ๋ฐ ์š”์•ฝ ๊ทธ๋ฆฌ๊ณ  ์‹คํ–‰ํ•ด๋ณด๋Š” ์Šคํ„ฐ๋”” ํ”„๋กœ์ ํŠธ์˜ ์ผํ™˜์ž…๋‹ˆ๋‹ค. Introducing Combine WWDC19์—๋Š” Apple์˜ ์ตœ์‹  Framework์ธ Combine์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•ด์„œ ์ด์•ผ๊ธฐํ•˜์ž๊ณ  ํ•˜๋ฉด์„œ ์„œ๋ง‰์„ ์—ฌ๋Š”๋ฐ์š”. ๊ฐ™์ด ์˜ˆ์‹œ๋ฅผ ๋ณด๊ณ  ์ดํ•ดํ•˜๋ฉด์„œ Combine์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋„๋ก ํ•ฉ์‹œ๋‹ค. ๊ฐ„๋‹จํ•œ ํšŒ์›๊ฐ€์ž… ํ™”๋ฉด์„ ์˜ˆ์‹œ๋กœ ๋“ญ๋‹ˆ๋‹ค. ์ด ํ™”๋ฉด์—์„œ์˜ ์š”๊ตฌ์‚ฌํ•ญ์€ ํฌ๊ฒŒ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์šฐ์„  ์‚ฌ์šฉ์ž ์ด๋ฆ„์ด ์œ ํšจํ•œ์ง€ ๋„คํŠธ์›Œํฌ์— ์š”์ฒญ์„ ํ•ด์„œ ํ™•์ธ์„ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์„œ๋กœ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ์ž‘์—…์€ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ์ฐจ๋‹จ๋˜์ง€ ์•Š๊ณ  ๋ฐ˜์‘ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € ์‚ฌ์šฉ์ž ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋„ ์ด๋ฏธ ๋งŽ์€ ๋น„๋™๊ธฐ ์ž‘์—…์ด ์ง„..
ยท๐ŸŒฑ SeSAC
์ธ์ฆํ‚ค์™€ gitignore ํ•ญ์ƒ gitignore๋Š” ๋จผ์ € ์ฒ˜๋ฆฌํ•˜์ž. ์ดํ›„์— ์ธ์ฆํ‚ค๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ ค๊ณ  ํ•˜๋ฉด commit์—๋„ ๋‚จ์•„์žˆ๊ณ , ์ด์ „ ๊ธฐ๋ก์— ๋‚จ์•„์žˆ์œผ๋ฏ€๋กœ ๋ฒˆ๊ฑฐ๋กญ๋‹ค. ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ empty ํŒŒ์ผ ์ƒ์„ฑ ํ›„ ํ”„๋กœ์ ํŠธ ๋ฐ”๋กœ ๋ฐ‘์— .gitignore ์ƒ์„ฑ ๊ฐ€๋Šฅ ํ˜‘์—… ์‹œ์—๋Š” property list, configuration์„ ์ด์šฉํ•˜๋Š” ์‹์œผ๋กœ๋„ ์ธ์ฆํ‚ค๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค. ์ˆจ๊ฒจ์•ผ ํ•˜๋Š” ํŒŒ์ผ์ด ๋งŽ์œผ๋ฉด public repository๊ฐ€ ์ ํ•ฉํ•œ์ง€๋ถ€ํ„ฐ ํŒ๋‹จํ•˜์ž. gitignore.io์— ๊ฐ€๋ฉด ์‰ฝ๊ฒŒ ํŒŒ์ผ์— ๋“ค์–ด๊ฐˆ ๋‚ด์šฉ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์ˆจ๊น€ํŒŒ์ผ๋กœ ์ž˜ ๋“ฑ๋กํ•˜๋ฉด ํ”„๋กœ์ ํŠธ ๋‚ด์˜ ํŒŒ์ผ ์˜†์— A(์ถ”๊ฐ€)/M(์ˆ˜์ •) ๋งˆํฌ๊ฐ€ ๋œจ์ง€ ์•Š๋Š”๋‹ค. Type Inference์™€ Type Annotation ์†๋„ ์ฐจ์ด Type Annotation์„ ์ด์šฉํ•˜๊ธฐ..
ยท๐ŸŒฑ SeSAC
App Transport Security Apple ์ธก์—์„œ๋Š” ์•ฑ ์ž์ฒด์˜ ๋ณด์•ˆ์„ฑ์„ ์œ„ํ•ด์„œ ATS(App Transport Security)๋ผ๋Š” ์ •์ฑ…์„ ํ†ตํ•ด ๊ธฐ๋ณธ์ ์œผ๋กœ https ํ†ต์‹ ์„ ํ•˜๋„๋ก ์œ ๋„ํ•˜๊ณ  ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ http ์„œ๋ฒ„์™€ ํ†ต์‹ ์„ ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. http ์„œ๋ฒ„๋กœ ํ…Œ์ŠคํŠธํ•˜๋ ค๋ฉด Info.plist์—์„œ ATS ๊ด€๋ จ ์„ค์ •์„ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ATS๋Š” iOS 9 ๋ฒ„์ „ ์ดํ›„๋ถ€ํ„ฐ ์ ์šฉ๋œ ๊ฐœ์ธ์ •๋ณด๋ณดํ˜ธ ๊ธฐ๋Šฅ์ด๊ณ , Xcode 7 ๋ฒ„์ „ ์ด์ƒ์—์„œ ์•ฑ ์ƒ์„ฑ ์‹œ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๊ฐ€์ ธ๊ฐ€๊ฒŒ ๋˜๋Š” ๋ณด์•ˆ ์ •์ฑ…์ด๋‹ค. http : Allow Arbitrary Loads๋ฅผ YES๋กœ ๋ณ€๊ฒฝ https : ๊ตณ์ด ์„ค์ •์„ ํ•ด์ค„ ํ•„์š”๊ฐ€ ์—†์Œ ๋ฐ์ดํ„ฐ ๋ฆฌ๋กœ๋“œ ์‹œ์  ํ…Œ์ด๋ธ” ๋ทฐ๋‚˜ ์ปฌ๋ ‰์…˜ ๋ทฐ ์‚ฌ์šฉ ์‹œ viewDidLoad ์‹œ์ ์— ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ..
ยท๐ŸŒฑ SeSAC
ํ”„๋กœํ† ์ฝœ๊ณผ String(describing: _)์‚ฌ์šฉํ•ด์„œ ๋ฆฌํ„ฐ๋Ÿดํ•œ ๊ฐ’ ๋œ์–ด๋‚ด๊ธฐ ๊ทธ ๋™์•ˆ identifier ๊ฐ’์„ ์“ฐ๋Š” ๊ณณ์ด ์ •๋ง ๋งŽ์•˜๋‹ค. ViewController์™€ TableViewCell, CollectionViewCell ๋“ฑ์—์„œ ๋งŽ์ด ์‚ฌ์šฉํ–ˆ์—ˆ๋‹ค. ๋งค ํด๋ž˜์Šค์—์„œ ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๋ฌธ์ž์—ด ๊ฐ’์„ ๋„ฃ๋Š” ๋Œ€์‹  ํ”„๋กœํ† ์ฝœ์„ ์ด์šฉํ•˜๋ฉด ๋ถˆํŽธํ•จ๊ณผ ๋ฐ˜๋ณต์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. protocol Reusable: Anyobject { static var reuseidentifier: String { get } } ๋‹ค์Œ๊ณผ ๊ฐ™์ด extension์—์„œ ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜๊ฒŒ ๋˜๋ฉด, ์ด์ œ reuseidentifier๋ฅผ ํŽธํ•˜๊ฒŒ ์ ‘๊ทผํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. extension UIViewController: ReusableViewProtocol { /..