์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- ๋นํธ์ฐ์ฐ์
- ์์
- BFS
- ์ฝํ
- Queue
- ๋ฌธ์์ด
- ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ
- ์คํ
- ๋ถํ ์ ๋ณต
- ๋ถํ ํ์
- ๋์ ํฉ
- ํ๋ก๊ทธ๋๋จธ์ค
- dp
- ios
- ์ฝ๋ฉํ ์คํธ
- WebView
- ๋ฐฑํธ๋ํน
- ๋ธ๋ฃจํธํฌ์ค
- ๋ถํ ์ ๋ณต
- ์๊ณ ๋ฆฌ์ฆ
- WebApp
- dfs
- ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ
- SwiftUI
- Swift
- ๋ธ๋ฃจํธํฌ์ค ์๊ณ ๋ฆฌ์ฆ
- ๋ฐฑ์ค
- ์ด์งํ์
- Today
- Total
๋ชฉ๋ก๐ iOS ๊ฐ๋ฐ (13)
MUKER_DEV with iOS
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/HVddG/btrHp2isDj6/a9koyqyfmv09sOxBZgt8f0/img.png)
๊ฐ์๋ฅผ ์๊ฐํ๋ฉฐ ์ฝ๋ฉํ๊ณ ์๋๋ฐ UIButton์ currentTitle๊ฐ์ ์๊พธ nil๋ก ๊ฐ์ ธ์ค๋๊ฒ ์๋๊ฐ ๋ถ๋ช ๋ฌธ์ ๊ฐ ์๋๋ฐ.. ํ๊ณ ๊ฒ์ํด๋ณด๋๊น ์ด์ ๋ฒ์ ผ์ xcode์์๋ UIButton์ Style์ด Default๋ก ๊ธฐ๋ณธ๊ฐ์ด ๋์ด์์์ง๋ง ๋ฒ์ ผ์ด ์ ๋ฐ์ดํธ ๋๋ฉด์ Stytle์ ๊ธฐ๋ณธ๊ฐ์ด Plain์ผ๋ก ๋์ด์๋๊ฒ ๋ฌธ์ ์๋ค. ๊ฐ๋จํ Style๊ฐ๋ง ๋ฐ๊ฟ์ฃผ๋ฉด currentTitle๊ฐ์ ์ ๊ฐ์ ธ์จ๋ค!
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dcZA1c/btrGJFz95LM/GV4uZQCGZf4JTzRjoExcU1/img.png)
์น์ฑ์์ ๊ถํ์ ์์ฃผ๊ณ ์นด๋ฉ๋ผ๋ฅผ ์คํ์ํค๋ ํจ์๋ฅผ ๋ฐ์ํ๋ฉด ์ฑ์ด ๊ทธ๋ฅ ๊บผ์ ธ๋ฒ๋ฆฐ๋ค. ์นด๋ฉ๋ผ ์คํ ํจ์๋ ์น์ ์ฝ๋ฉ๋์ด ์์ด์ ๊ถํ๋ง ์ฃผ๋ฉด ๋๋ค. Xcode - ProjectNavigator - Info.plist ์ ๋ค์ด๊ฐ ๋ค์ ์ ์ผ ์์ ์๋ Information Property List ์์ Add Row๋ฅผ ํ๋ค. Privacy - Photo Library Additions Usage Description (์ฌ์ง ์ฌ์ฉ) ์ ์ถ๊ฐํ๊ณ Privacy - Camera Usage Description (์นด๋ฉ๋ผ ์ฌ์ฉ) ์ ์ถ๊ฐํ๋ฉด ๋๋ค. ๋๋ ์ฌ์ง์ฌ์ฉ ๊ถํ์ ์์ค๋ ์น์ฑ์์ ์ ์คํ์ด ๋๋๋ผ.. ๋ญ์งใ ใ Value๋ ํด๋น ๊ถํ์ ๋ถ์ฌํ ๋ ๋์ค๋ ์๋ฆผ์ฐฝ์ ๋ค์ด๊ฐ ์๋ฆผ๋ง์ ์ถ๊ฐํ๋ฉด ๋๋๋ฐ $(PRODUCT_NAM..
์น์ด๋ ์๋๋ก์ด๋ ํ๊ฒฝ์์๋ ์ ์๋ํ๋ ์ ํ, ๋ฌธ์ ๋ณด๋ด๊ธฐ ๋ฒํผ์ด ์ด์ํ๊ฒ iOS์ธ์ฑ์์๋ ์๋ํ์ง ์์๋ค. ๋ฌธ์ ๋ html์์ ํ๊ทธ๊ฐ ์ ๋์ํ์ง ์์์์๋ค! ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ธ tag์์ target="_parent" ๋ฅผ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค. ์ถ๊ฐ๋ก ์น๋ทฐ์์ ํด๋ฆญ์ก์ ์ ๋ฐ๊ธฐ์ํด WebView์ Delegate๋ฅผ ๋ ์ถ๊ฐํด์ค์ผ ํ๋ค. class ViewController: UIViewController, WKNavigationDelegate, WKUIDelegate{ @IBOutlet weak var webView: WKWebView! webView.navigationDelegate = self webView.uiDelegate = self super.viewDidLoad() webViewInit() fun..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/8oZNB/btrDHefVv93/dlpWn5I2Ho1JR6Re8RiIOk/img.png)
Firebase ํํ์ด์ง์์ ์ํ๋ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์ด ์ค๋ค์ ๋ฉ์ธํ์ด์ง์ ์๋ '์ฑ์ Firebase๋ฅผ ์ถ๊ฐํ์ฌ ์์ํ๊ธฐ'์์ ํด๋นํ๋ ํ๋ก์ ํธ๋ฅผ ์ ํํ๋ค iOS๋๋ฌ์ฃผ๊ณ Bundle Identifier์ ์๋ ์ด๋ฆ์ Apple ๋ฒ๋ค ID๋ก ์ ๋ ฅํด์คฌ๋ค ๋ฐ์ ์ฑ ๋๋ค์ํ๊ณ App Stroe ID๋ ๋์ค์ ์ฑ์คํ ์ด์ ์ฌ๋ฆฌ๋ฉด ๊ธฐ์ ํ ์ ์์ผ๋๊น ํจ์ค~ ๊ตฌ์ฑํ์ผ ๋ค์ด๋ก๋ ํด์ฃผ๊ณ ~ ๋ค์ด๋ก๋ ํด์ค ํ์ผ์ ํ๋ก์ ํธ์ ๋ฃ์ด์ค๋ค ๊ทธ๋ค์ Firebase SDK๋ฅผ ์ถ๊ฐ ํ๋ผ๊ณ ๋์ค๋๋ฐ ์ฐ๋ฆฐ CocoaPods ์ด์ฉํ๊ธฐ ๋๋ฌธ์ Package Manager๋ ์ ๊ฒฝ์์จ๋ ๋จ ์ฝ์ฝ์ ํ์ ๋ชฉ๋ก์ ๋ค์ด๊ฐ๋ณด๋ฉด ์น์ ํ ์ถ๊ฐ ๋ฐฉ๋ฒ์ด ๋์์๋ค ์ฐ๋ฆฐ Podfile์ ๋ง๋ค์ด ์คฌ์ผ๋๊น 1๋ฒ์ ๋๊ธฐ๊ณ Firebaseํฌ๋๋ฅผ ์ถ๊ฐํด์ผํ๋ค Firebase..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/yYndf/btrDE0WhJWy/BjjxMnsZEiueUS06knjzz1/img.png)
๋จผ์ cocoa pod์ ์ค์น ๋ฐ ์ ๋ฐ์ดํธ ํ๋ค ๊ทธ๋ค์ ํ๋ก์ ํธ๊ฐ ์๋ ํด๋์ pod์ ์ค์นํด์ฃผ๋ฉด ๋๋๋ฐ ํฐ๋ฏธ๋์ ํด๋นํด๋๋ก ๊ฐ ์ ์๊ฒ cd ์ ๊ฒฝ๋ก๋ฅผ ๋ถ์ฌ์ฃผ๋ฉด ๋๋ค ๊ฒฝ๋ก๋ฅผ ์ฝ๊ฒ ๋ถ์ฌ์ฃผ๋ ๋ฐฉ๋ฒ์ ํด๋๋ฅผ ๋๋๊ทธ ํด์ ํฐ๋ฏธ๋์ ๋ฃ์ด์ฃผ๋ฉด ๊ฒฝ๋ก๊ฐ ์์์ ๋ฌ๋ค ๊ฒฝ๋ก์ pod init์ ํด์ฃผ๋ฉด ํด๋์ pod ํ์ผ์ด ์๋ ์ค์น๊ฐ ๋๋ค pod ํ์ผ์ ์ํ๋ pod์ ์ค์นํด์ฃผ๋ฉด ๋๋ค!
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/qFUqp/btrCDbYp13H/2zPT0dkkQQnAIYIvN1KkP1/img.png)
pod install์ ํ๋ ์์์ง๋ ๋ฐฉ๋ํ ์์ error xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require': dlopen(/Library/Ruby/Gems/2.6.0/gems/ffi-1.15.5/lib/ffi_c.bundle, 0x0009): tried..
๋จผ์ Optional์ ๊ธฐ๋ณธ์ ์ธ ์ ์๋ "๊ฐ์ด ์์ ์๋ ์์ ์๋ ์๋ค" ๋ผ๊ณ ๋งํด์ฃผ๋ ๊ฒ์ด๋ค Optional์ ์ฌ์ฉํจ์ผ๋ก์ nil์ด ์๋์ง ์๋์ง๋ฅผ ํ์ธํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ ํ์ดํธํ๊ฒ ๊ด๋ฆฌํด ์๋ฌ๋ฅผ ์ค์ฌ์ค ์ ์๋ค ๋ฐ์ Optional์ ์ฌ์ฉํ๋ 5๊ฐ์ง ๋ฐฉ๋ฒ์ด๋ค 1. Force Unwrapping 2. Cheak for nil value 3. Optional Binding 4. Nil Coalescing Operator 5. Optional Chaining ์ 5๊ฐ์ง ๋ฐฉ๋ฒ์ ์ฌ์ฉํด์ ์ต์ ๋์ ์ดํดํ๊ณ ์ฌ์ฉํด๋ณด์ ์ผ๋จ ๊ฐ๋จํ๊ฒ ์ต์ ๋์ ์ฌ์ฉํด์ ๋ณ์๋ฅผ ๋ง๋ค์ด๋ณด์ let myOptional: String? myOptional = "Muker" let text: String = myOptional // ์๋ฌ๊ฐ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dqea1c/btrBT4MHGd2/UP2njpTn62UI4BdKU1Wo1k/img.png)
ํด๋ก์ ๋ ํ๋ช ์ ํจ์๋ฅผ ์ ์ํ ๋ ์์ฒญ ์๊ฐ๋ณด๋ค ๋ง์ ์ฝ๋๋ฅผ ์ค์ฌ์ค ์ผ๋จ! ๊ธฐ๋ณธ์ ์ธ ๊ฐ๋จํ ์ซ์ ๋๊ฐ๋ฅผ ๋ํ๋ ํจ์๋ฅผ ๋ง๋ค์ด๋ด func calculator (n1: Int, n2: Int, operation: (Int, Int) -> Int ) -> Int { return operation(n1, n2) } func add (no1: Int, no2: Int) -> Int { return no1 + no2 } calculator(n1: 3, n2: 3, operation: add) calculator ํจ์๋ฅผ ๋ง๋ค๊ณ ์ฒซ๋ฒ์งธ, ๋๋ฒ์งธ ์ธ์์ ๋์ด ๋ํ ๊ฐ์ ๋ฐ๊ณ ์ธ๋ฒ์งธ ์ธ์์ ํจ์๋ฅผ ๋ฐ์๋ฒ๋ฆผ ์ธ์์ ๋ค์ด๊ฐ ํจ์ operation์ return๊ฐ์ผ๋ก์ ๋๊ฐ์ ๊ฐ์ returnํด์ค๊ฑฐ์ ๊ทธ๋ผ add ํจ์๋ ๊ฐ๋จํ๊ฒ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/Qc6G1/btrze0Nf7L7/W2RaMN2mKvsiBtbsZDm8W0/img.png)
preview๋ ๊ธฐ๋ณธ์ ์ผ๋ก canvas์ ์ํ๋ ๊ธฐ์ข ์ ๋ชจ์์ผ๋ก ๋ฟ๋ ค์ค๋ค. ์ด๋ ์ํ๋ ํฌ๊ธฐ ๋งํผ์ layout์ผ๋ก preview๋ฅผ ์ค์ ํ๊ณ ์ถ๋ค๋ฉด .previewLayout ์์์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค. .previewLayout(.fixed(width: 300, height: 70)) Group์ ์ง์ด์ ์ฌ๋ฌ๊ฐ์ ๋ทฐ๋ฅผ ํ๋ฒ์ canvas์ ๋์ธ ์ ์์ต๋๋ค. struct LandmarkRow_Previews: PreviewProvider { static var previews: some View { Group { LandmarkRow(landmark: landmarks[0]) LandmarkRow(landmark: landmarks[1]) } .previewLayout(.fixed(width: 300, ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/ctby0G/btrx1xzbwvO/xKkB3fIQo6nX6wbS3EL9fK/img.png)
BundleExtension.swift extension Bundle { func decode(filename: String, as type: T.Type) -> T { guard let url = self.url(forResource: filename, withExtension: nil) else { fatalError("๋ฒ๋ค์ \(filename)์ด ์์ต๋๋ค.") } guard let data = try? Data(contentsOf: url) else { fatalError("\(url)๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ฌ ์ ์์ต๋๋ค.") } guard let decodedData = try? JSONDecoder().decode(T.self, from: data) else { fatalError("๋ฐ์ดํฐ ๋ณตํธ..