IOS

ยท๐ŸŽ iOS & Swift
UIButton.Configuration iOS 15.0๋ถ€ํ„ฐ ์ด์šฉ ๊ฐ€๋Šฅ Struct ํƒ€์ž… ๊ธฐ๋ณธ ์ œ๊ณต Configuration ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณต๋˜๋Š” ๋ฒ„ํŠผ ์Šคํƒ€์ผ์ด ํƒ€์ž… ๋ฉ”์„œ๋“œ ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด์ ธ์žˆ๋‹ค. Configuration ํ™•์žฅ ๋งค๋ฒˆ configuration์„ ๋ฒ„ํŠผ๋งˆ๋‹ค ๋งŒ๋“ค์–ด ์ฃผ๋Š”๊ฒŒ ์ฝ”๋“œ ๋ผ์ธ๋„ ๊ธธ์–ด์ง€๊ณ  ๊ท€์ฐฎ์•˜๋Š”๋ฐ ๋ฉ˜ํ† ๋‹˜๊ป˜์„œ ๋ง์”€ํ•ด์ฃผ์‹  extension์œผ๋กœ ํ™•์žฅํ•œ๋‹ค๋Š” ๊ด€์ ์ด ์ข‹์•˜๋‹ค. ํ”„๋กœ์ ํŠธ ๋‚ด์— ๋ฒ„ํŠผ ์Šคํƒ€์ผ์ด ๋ช‡ ๊ฐ€์ง€ ์—†๊ฑฐ๋‚˜ ์ผ์ •ํ•˜๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งŒ๋“ค์–ด์“ฐ๋Š” ๊ฒƒ์ด ์ข‹์•„๋ณด์ธ๋‹ค. (๊ธฐ๋ณธ ์ œ๊ณต ์Šคํƒ€์ผ๊ณผ ๋™์ผํ•œ ์•„์ด๋””์–ด ์ธ ๊ฒƒ ๊ฐ™๋‹ค.) ์ง„ํ–‰ ์ค‘์ธ ํ”„๋กœ์ ํŠธ ์˜ˆ์‹œ ์•„์ง ์‹ค์ œ๋กœ ์ ์šฉํ•˜์ง€๋Š” ์•Š์•˜์ง€๋งŒ, ํ”„๋กœ์ ํŠธ ๋‚ด์— 3๊ฐ€์ง€ ์Šคํƒ€์ผ์˜ ๋ฒ„ํŠผ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ์— ์—ด๊ฑฐํ˜•(Enum)๊ณผ Configuration ํ™•์žฅ์„ ..
ยท๐ŸŒฑ 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..
ยท๐ŸŒฑ 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..
taeeekki
'IOS' ํƒœ๊ทธ์˜ ๊ธ€ ๋ชฉ๋ก (6 Page)