TIL

ยท๐ŸŒฑ SeSAC
ํƒ€์ž… ํ™•์ธ type(of: x) type(of: value) ํ˜• ๋ณ€ํ™˜ - ํƒ€์ž… ๋ณ€ํ™˜ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ ์‚ฌ์šฉ ์ด๋‹ˆ์…œ๋ผ์ด์ € ๊ตฌ๋ฌธ์„ ํ†ตํ•ด์„œ ์ƒˆ๋กญ๊ฒŒ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ let value = String(a) ํƒ€์ž… ํ™•์ธ ์—ฐ์‚ฐ์ž is ์–ด๋–ค ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ํƒ€์ž…์ธ์ง€, ์–ด๋–ค ๋ฐ์ดํ„ฐ ํƒ€์ž…์ธ์ง€ ํ™•์ธํ•  ๋•Œ ์‚ฌ์šฉ class Mobile { let name: String var introduce: String { return "\(name) ์ž…๋‹ˆ๋‹ค." } init(name: String) { self.name = name } } class Apple: Mobile { let wwdc = "WWDC22" } class Google: Mobile {} mobile is Mobile mobile is Apple mobile is G..
ยท๐ŸŒฑ SeSAC
FrameBaseLayout FrameBaseLayout + AutoResizing ์š”์ฆ˜์—๋Š” ํ•ด๋‹น ๋ฐฉ์‹์œผ๋กœ๋Š” ๊ธฐ๊ธฐ๋ฅผ ์ „๋ถ€ ๋Œ€์‘ํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง view.addSubview(emailTextField) // ํฌ๊ธฐ์™€ ์œ„์น˜ ๋ฐ ์†์„ฑ ์ •์˜ emailTextField.frame = CGRect(x: 50, y: 50, width: UIScreen.main.bounds.width - 100, height: 50) emailTextField.borderStyle = .line emailTextField.backgroundColor = .lightGray AutoLayout AutoLayout (๊ธฐ๊ธฐ๋ณ„ ๋Œ€์‘ ํ•„์š”) + NSLayoutConstraints Class(- base) AutoLayout ์ž‘์—… ์‹œ AutoResi..
ยท๐ŸŒฑ SeSAC
๊ธฐ์ˆ  ์ปจํผ๋Ÿฐ์Šค ๊ธฐ์ˆ  ์ปจํผ๋Ÿฐ์Šค, ๋ธ”๋กœ๊ทธ ์ž์ฃผ ๋ณด๊ธฐ! wwdc if kakao slash tech blog ๋ชจ๋“ˆํ™”์™€ ์ ‘๊ทผ ์ œ์–ด ๋ชจ๋“ˆํ™” ์ž‘์—…์„ ํ•˜๋‹ค๋ณด๋ฉด ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ์—์„œ ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. UI ์ปดํฌ๋„ŒํŠธ, ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํด๋ž˜์Šค ๋“ฑ๋“ฑ์ด ์žˆ์„ํ…๋ฐ ์ด๋ฅผ ๋งค ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ์ง์ ‘ ์ž‘์„ฑํ•ด์ฃผ๋Š” ๊ฒƒ๋ณด๋‹ค ๋น„์Šทํ•œ ์„ฑ๊ฒฉ์˜ ์ฝ”๋“œ๋ผ๋ฆฌ ๋ชจ์•„์„œ ์ข€ ๋” ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋งŒ๋“ ๋‹ค๊ณ ๋„ ์ดํ•ดํ•ด๋ณผ ์ˆ˜ ์žˆ์Œ ๋ชจ๋“ˆํ™”๋ฅผ ํ•ด๋ณด๋ฉด ์ ‘๊ทผ ์ œ์–ด์— ๋Œ€ํ•œ ๊ฐœ๋…์ด ์กฐ๊ธˆ ๋ช…ํ™•ํ•ด์ง (- ์‹ค์ œ๋กœ ๋‚ด๊ฐ€ EasyKit์ด๋ผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋ฉด์„œ ๋Š๊ผˆ๋˜ ๋ถ€๋ถ„์ด๋‹ค.) ์‹ค์ œ ํ”„๋กœ์ ํŠธ๋Š” ์กฐ๊ธˆ ๊ฐ€๋ฒผ์›Œ์ง ๊ฐ๊ฐ ์—ญํ• ์— ๋Œ€ํ•œ ๋ถ„๋ฆฌ๊ฐ€ ๋ช…ํ™•ํ•ด์ง ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ, UI ๋ชจ์•„๋†“๊ธฐ ์ ‘๊ทผ ์ œ์–ด ์ด๋ก ์ ์œผ๋กœ ์ •๋ฆฌํ•˜๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•˜์ง€๋งŒ..
ยท๐ŸŒฑ SeSAC
๋Œ์•„๋ณด๋ฉฐ ์ƒˆ์‹น ๊ณผ์ •์„ ์‹œ์ž‘ํ•˜๊ณ  ๋ฒŒ์จ 30๋ฒˆ์งธ TIL์ด๋‹ค. (1, 2์ผ์ฐจ TIL์€ ์–ด์ฉŒ๋‹ค ๋ณด๋‹ˆ ๋นผ๋จน๊ฒŒ ๋˜์—ˆ์ง€๋งŒ) ์ฐธ ์‹œ๊ฐ„ ๋น ๋ฅด๋‹ค... ์ฒ˜์Œ์—๋Š” ์™„๋ฒฝํ•˜๊ฒŒ ์“ฐ๊ณ  ์‹ถ์–ด์„œ ๋ฏธ๋ฃจ๋‹ค๊ฐ€ ์ •๋ง ๋งŽ์ด ๋ฐ€๋ ธ์—ˆ๋Š”๋ฐ ์ด๋Ÿฌ๋‹ค๊ฐ€ ํ•˜๋‚˜๋„ ๋ชป ์“ธ ๊ฒƒ ๊ฐ™์•„์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•„๊ธฐํ•ด ๋’€๋˜ ๊ฑฐ ์งค๋ง‰ํ•˜๊ฒŒ ์˜ฌ๋ฆฌ๋Š” ํ˜•ํƒœ๋กœ ๋ฐ”๊พธ์—ˆ๋‹ค. ๋‚˜์ค‘์— ๋‹ค์‹œ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ๋ชจ์•„๋†“์•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์ถฉ๋ถ„ํžˆ ์ข‹์€ ์ž์‚ฐ์ด ๋˜์ง€ ์•Š์„๊นŒ ์‹ถ๋‹ค. (30์ผ์ฐจ๊นŒ์ง€ ๊ทธ๋ž˜๋„ ๋ช‡ ์ž ์ ์œผ๋ ค๊ณ  ๋…ธ๋ ฅํ•œ ๊ฒƒ์€ ์นญ์ฐฌํ•œ๋‹ค.) ์—ฌ๊ธฐ์„œ ์ž์ฒด ํ”ผ๋“œ๋ฐฑ์„ ํ•˜์ž๋ฉด, TIL์€ ๊ทธ๋‚  ๊ทธ๋‚  ์“ฐ๋Š”๊ฒŒ ๋ฒ ์ŠคํŠธ์ธ ๊ฒƒ ๊ฐ™๊ณ  ํ‚ค์›Œ๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ทธ์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ–ˆ๋˜ ๋‚˜์˜ ์ƒ๊ฐ์„ ์ตœ๋Œ€ํ•œ ๋งŽ์ด ์ ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ณด์™„ํ•ด๋‚˜๊ฐ€๋ ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฝ”๋“œ ์กฐ๊ฐ๋„ ๋งŽ์ด ๋ชจ์•„๋†“์œผ๋ฉด ์ข‹๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐ์ด ๋“ ๋‹ค. ์‚ฌ์‹ค 30์ผ์ฐจ๊นŒ์ง€์˜ TIL์€ ๋‚ด์šฉ์„..
ยท๐ŸŒฑ SeSAC
MapView ์ธํ„ฐํŽ˜์ด์Šค ๋นŒ๋” ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉ๋ฒ•์„ ์ฒดํฌํ•ด๋ณด์ž import MapKit // ํ™”๋ฉด์— MKMapView ๊ฐ์ฒด๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์•„์›ƒ๋ ›์„ ์—ฐ๊ฒฐํ•˜์ž @IBOutlet weak var mapView: MKMapView! let center = CLLocationCoordinate2D(latitude: 37.000000, longitude: 126.000000) // Region ์„ค์ • // ์ง€๋„ ์ค‘์‹ฌ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ณด์—ฌ์งˆ ๋ฒ”์œ„ ์„ค์ • let region = MKCoordinateRegion(center: center, latitudinalMeters: 1000, longitudinalMeters: 1000) mapView.setRegion(region, animated: true) // Annotation ์„ค์ • (..
ยท๐ŸŒฑ SeSAC
ReusableView Protocol ๊ธฐ์กด์— cell ๋งˆ๋‹ค id๋ฅผ ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋กœ ๋งŒ๋“ค์–ด์„œ ๊ด€๋ฆฌํ•˜๋˜ ๋ฐฉ์‹์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ”„๋กœํ† ์ฝœ๋กœ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ protocol ReusableViewProtocol { static var reuseIdentifier: String { get } } extension UICollectionViewCell: ReusableViewProtocol { static var reuseIdentifier: String { return String(describing: self) } } extension UITableViewCell: ReusableViewProtocol { static var reuseIdentifier: String { return String(describing: ..
ยท๐ŸŒฑ 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..
taeeekki
'TIL' ํƒœ๊ทธ์˜ ๊ธ€ ๋ชฉ๋ก (2 Page)