คำถามและคำตอบสัมภาษณ์ iOS 30 อันดับแรก (2026)

การเตรียมตัวสำหรับงานด้าน iOS หมายถึงการคาดการณ์ว่าผู้สัมภาษณ์จะประเมินพื้นฐาน การแก้ปัญหา และการตัดสินใจอย่างไรเมื่อเข้ามาในห้องสัมภาษณ์ คำถามสัมภาษณ์ iOS เหล่านี้จะเผยให้เห็นถึงความพร้อม ความรู้เชิงลึก และการคิดภายใต้ความกดดัน
เส้นทางอาชีพในด้านการพัฒนา iOS ครอบคลุมตั้งแต่บริษัทสตาร์ทอัพไปจนถึงองค์กรขนาดใหญ่ โดยเชื่อมโยงเทรนด์ต่างๆ เข้ากับผลิตภัณฑ์จริง ผู้สมัครจะต้องแสดงให้เห็นถึงประสบการณ์ด้านเทคนิค ความเชี่ยวชาญเฉพาะด้าน ทักษะการวิเคราะห์ และทักษะการปฏิบัติจริงขณะทำงานในภาคสนาม ซึ่งจะช่วยให้ทีม ผู้จัดการ และผู้บริหารระดับสูงประเมินผู้สมัครระดับเริ่มต้น ระดับกลาง และระดับผู้เชี่ยวชาญ ผ่านคำถามและคำตอบทั่วไปในบทบาททางเทคนิคขั้นสูง อ่านเพิ่มเติม ...
👉 ดาวน์โหลดไฟล์ PDF ฟรี: คำถามและคำตอบสำหรับการสัมภาษณ์งานด้าน iOS
คำถามและคำตอบสัมภาษณ์งานด้าน iOS ยอดนิยม
1) คืออะไร Swift ส่วนประกอบเพิ่มเติมและวิธีการแกะส่วนประกอบเหล่านั้นอย่างปลอดภัย?
Swift ไม่จำเป็น เป็นชนิดข้อมูลที่อาจมีค่าหรือค่าว่าง (nil) ช่วยป้องกันการเกิดข้อผิดพลาดที่ไม่คาดคิดเนื่องจากค่าที่หายไป เมื่อตัวแปรไม่มีค่าใดๆ เลย Swift บังคับให้คุณต้องจัดการกับกรณีนั้นอย่างชัดเจน
วิธีแกะของขวัญอย่างปลอดภัย:
- การผูกข้อมูลเสริม (
if let,guard let) — เป็นที่ต้องการในการสัมภาษณ์งาน - การเชื่อมโยงแบบเลือกได้ (
?.) — เข้าถึงคุณสมบัติหรือเรียกใช้เมธอดได้อย่างปลอดภัย - การรวมตัวกันเป็นศูนย์ (
??) — ระบุค่าเริ่มต้น
ตัวอย่าง:
var name: String? = "Alice"
// if let
if let unwrappedName = name {
print("Hello, \(unwrappedName)")
}
// guard let
func greet() {
guard let unwrappedName = name else { return }
print("Hello, \(unwrappedName)")
}
ใช้ guard let เพื่อปิดฟังก์ชันการทำงานก่อนกำหนดและลดความซับซ้อนของกระบวนการ ซึ่งเป็นแนวทางปฏิบัติที่ดีที่พบได้ทั่วไป
2) อธิบายวงจรชีวิตของแอปและสถานะหลัก ๆ ใน iOS
วงจรชีวิตของแอปพลิเคชัน iOS อธิบายถึงวิธีการที่ระบบเปลี่ยนสถานะของแอปผ่านสถานะการทำงานต่างๆ การทำความเข้าใจวงจรชีวิตนี้มีความสำคัญอย่างยิ่ง เนื่องจากผู้สัมภาษณ์มักทดสอบความรู้เกี่ยวกับวงจรชีวิตของแอปพลิเคชัน turing.com+1
สหรัฐอเมริกา:
- ไม่ได้ทำงาน — แอปไม่ได้ถูกเปิดใช้งาน/ปิดลง
- เฉื่อยชา — แอปทำงานอยู่เบื้องหน้า แต่ไม่ได้รับเหตุการณ์ใดๆ
- ใช้งาน — แอปกำลังทำงานและรับเหตุการณ์อยู่
- พื้นหลัง — แอปกำลังทำงานอยู่ แต่ไม่ได้แสดงอยู่เบื้องหน้า
- ที่ถูกระงับ — แอปอยู่ในหน่วยความจำ แต่ไม่ได้ประมวลผลโค้ด
ตัวอย่างกรณีการใช้งาน: หากแอปทำงานในพื้นหลัง คุณอาจเริ่มการดึงข้อมูลหรืออัปโหลดข้อมูลในพื้นหลังขณะที่ส่วนติดต่อผู้ใช้ถูกซ่อนอยู่
3) ความแตกต่างระหว่างเฟรมและขอบเขตใน UIView คืออะไร?
ความเข้าใจในเรขาคณิตและแนวคิดการจัดวางเป็นสิ่งสำคัญสำหรับงานที่เกี่ยวข้องกับส่วนติดต่อผู้ใช้ (UI)
เฟรมเทียบกับขอบเขต:
| อสังหาริมทรัพย์ | ความหมาย | พื้นที่พิกัด |
|---|---|---|
| กรอบ | ตำแหน่งและขนาดของมุมมองเมื่อเทียบกับมุมมองหลัก | ระบบพิกัดของ Superview |
| ขอบเขต | ขนาดและตำแหน่งของมุมมองเมื่อเทียบกับตัวมันเอง | ระบบพิกัดของตัวเอง |
ตัวอย่าง: ถ้ามุมมองหมุนไป มุมมองนั้น... ขอบเขต ยังคงเหมือนเดิม แต่ กรอบ การเปลี่ยนแปลงอันเนื่องมาจากการแปลงสภาพ
4) อธิบายการจัดการหน่วยความจำและ ARC ใน iOS
การรั่วไหลของหน่วยความจำและวงจรการเก็บรักษาข้อมูลเป็นข้อผิดพลาดที่พบได้บ่อยในการสัมภาษณ์งาน ARC (การนับอ้างอิงอัตโนมัติ) ฉันแสดง Swift จัดการหน่วยความจำ โดยนับจำนวนการอ้างอิงที่แข็งแกร่งและปล่อยหน่วยความจำเมื่อจำนวนนั้นเป็นศูนย์
คีย์ Concepts:
- แข็งแรง — เพิ่มจำนวนการอ้างอิง
- อ่อนแอ - ทำ ไม่ เพิ่มจำนวนการอ้างอิง; ค่าจะกลายเป็น nil เมื่อวัตถุถูกยกเลิกการจัดสรร
- ไม่มีเจ้าของ — คล้ายกับอ่อนแอ แต่คาดว่าจะไม่เป็นศูนย์อย่างแน่นอน
ตัวอย่าง:
class ViewController {
var closure: (() -> Void)?
func setupClosure() {
closure = { [weak self] in
print(self?.description ?? "No self")
}
}
}
การใช้ [weak self] ช่วยหลีกเลี่ยงการวนลูปของค่าคงค้างระหว่างฟังก์ชันปิดและตัวควบคุมมุมมอง
5) เฟรมเวิร์กแบบคงที่ (Static Framework) และเฟรมเวิร์กแบบไดนามิก (Dynamic Framework) ใน iOS แตกต่างกันอย่างไร?
นี่เป็นคำถามสัมภาษณ์ระดับสถาปัตยกรรมที่มักถูกถามสำหรับตำแหน่งงานระดับกลาง
| ลักษณะ | เฟรมเวิร์กคงที่ | กรอบการทำงานแบบไดนามิก |
|---|---|---|
| เวลาโหลด | ในระหว่างขั้นตอนการสร้างแอป | ในระหว่างการทำงาน |
| ขนาดแอป | ที่มีขนาดใหญ่ | ที่มีขนาดเล็ก |
| การปรับปรุง | ต้องทำการสร้างใหม่ | สามารถอัปเดตได้ด้วยตนเอง |
ตัวอย่าง: ใช้เฟรมเวิร์กแบบคงที่สำหรับยูทิลิตี้ขนาดเล็ก และใช้เฟรมเวิร์กแบบไดนามิก เช่น SDK ขนาดใหญ่ (เช่น Firebase) เพื่อลดขนาดแอปเริ่มต้น
6) เปรียบเทียบรูปแบบการออกแบบ MVVM กับ MVC
ความเข้าใจด้านสถาปัตยกรรมจะทำให้คุณเป็นผู้สมัครที่มีคุณสมบัติเหมาะสมยิ่งขึ้น
MVC (Model-View-Controller):
- ข้อดี: เรียบง่าย ใช้งานกันอย่างแพร่หลาย
- ข้อเสีย: ตัวควบคุมมักจะมีขนาดใหญ่เกินไป ("Massive View Controller")
MVVM (Model-View-ViewModel):
- ข้อดี: ทดสอบได้ง่ายกว่า แยกสารได้สะอาดกว่า
- ข้อเสีย: ต้องเขียนโค้ดการตั้งค่าเพิ่มเติม
ตัวอย่าง: ใช้ MVVM ในสถานการณ์ที่มีการผูกข้อมูลที่ซับซ้อน (เช่น กับ SwiftUI) และ MVC สำหรับฟอร์มแบบง่ายหรือโค้ด UIKit เดิม
7) อธิบายความแตกต่างระหว่างการอ้างอิงที่แข็งแกร่ง การอ้างอิงที่อ่อนแอ และการอ้างอิงที่ไม่มีเจ้าของ
นี่คือความรู้พื้นฐานที่สำคัญเกี่ยวกับการจัดการหน่วยความจำ
- แข็งแรง — ป้องกันการยกเลิกการจัดสรรจนกว่าจำนวนการอ้างอิงจะเป็นศูนย์
- อ่อนแอ - ทำ ไม่ เพิ่มจำนวน; ค่าจะกลายเป็นศูนย์โดยอัตโนมัติ
- ไม่มีเจ้าของ — ไม่ทำให้จำนวนเพิ่มขึ้น; ถือว่า วัตถุที่ถูกอ้างถึงจะมีอายุตราบเท่าที่การอ้างอิงนี้ยังคงอยู่
ตัวอย่าง: ใช้ unowned เมื่อวัตถุสองชิ้นอ้างอิงถึงกัน แต่ในเชิงตรรกะแล้ว ชิ้นหนึ่งจะมีอายุยืนยาวกว่าอีกชิ้นเสมอ
8) ข้อมูลหลัก (Core Data) คืออะไร และควรใช้เมื่อใด?
Core Data คือเฟรมเวิร์กสำหรับการสร้างกราฟวัตถุและการจัดเก็บข้อมูลถาวรของ Apple ซึ่งมักถูกถามในการสัมภาษณ์งานระดับกลาง
ใช้กรณี:
- การจัดเก็บข้อมูลที่มีโครงสร้างซับซ้อน
- ความสัมพันธ์และการรองรับการยกเลิก/ทำซ้ำ
- การดึงข้อมูลอย่างมีประสิทธิภาพด้วยเงื่อนไข (predicates)
ตัวอย่าง: ใช้ Core Data ในการสร้างรายการสิ่งที่ต้องทำ เพื่อเก็บรักษาภารกิจต่างๆ ระหว่างการเปิดแอป และเรียกดูข้อมูลได้อย่างมีประสิทธิภาพ
9) อธิบายรูปแบบ Delegate และวิธีการใช้งานใน iOS
รูปแบบการมอบหมาย (Delegate pattern) ช่วยให้วัตถุหนึ่งสามารถส่งข้อความไปยังอีกวัตถุหนึ่งได้โดยไม่ต้องมีการเชื่อมโยงที่แน่นหนา ซึ่งเป็นสิ่งที่จำเป็นอย่างมากทั้งสำหรับผู้จบใหม่และผู้มีประสบการณ์
วิธีการทำงาน:
- กำหนดโปรโตคอล
- อ็อบเจ็กต์ (delegate) ทำหน้าที่ดำเนินการตามเมธอดของโปรโตคอล
- อ็อบเจ็กต์ที่มอบหมายจะเรียกใช้เมธอดบนตัวแทนนั้น
ตัวอย่าง: UITableViewDelegate แจ้งเตือนเมื่อมีการแตะที่แถวใดแถวหนึ่ง
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print("Row selected at \(indexPath.row)")
}
10) การจัดวางอัตโนมัติ (Auto Layout) คืออะไร และทำไมจึงสำคัญ?
Auto Layout ปรับเลย์เอาต์ให้เข้ากับขนาดหน้าจอและการวางแนวหน้าจอ ซึ่งเป็นหัวข้อสำคัญในการสัมภาษณ์งานด้าน UI
วิธีการทำงาน:
- การใช้งาน ข้อ จำกัด เพื่อกำหนดความสัมพันธ์ (ส่วนนำ ส่วนตาม ความกว้าง ความสูง)
- รองรับ UI ที่ปรับเปลี่ยนได้ตามขนาดหน้าจอของ iPhone/iPad
ตัวอย่าง: ใช้ข้อจำกัดเพื่อให้ปุ่มอยู่ตรงกลางเสมอไม่ว่าจะขนาดหน้าจอเท่าใดก็ตาม
11) Grand Central Dispatch (GCD) คืออะไร และช่วยในการจัดการการทำงานพร้อมกันได้อย่างไร?
แกรนด์เซ็นทรัลดิสแพตช์ (GCD) เป็น API ระดับต่ำของ Apple สำหรับจัดการการทำงานพร้อมกัน ช่วยให้สามารถเรียกใช้งานหลายงานพร้อมกันได้ ปรับปรุงประสิทธิภาพโดยไม่ทำให้เธรดหลักหยุดชะงัก
แกน Concepts:
- คิวแบบอนุกรม: ดำเนินการทีละงาน (มีประโยชน์สำหรับการรักษาความสม่ำเสมอของข้อมูล)
- คิวพร้อมกัน: ดำเนินการหลายงานพร้อมกัน (สำหรับการทำงานแบบขนาน)
- คิวหลัก: ใช้สำหรับการอัปเดต UI (ควรรันโค้ด UI ที่นี่เสมอ)
ตัวอย่าง:
DispatchQueue.global(qos: .background).async {
let data = fetchData()
DispatchQueue.main.async {
self.updateUI(with: data)
}
}
วิธีนี้จะช่วยให้การดึงข้อมูลเกิดขึ้นในพื้นหลัง ในขณะที่การอัปเดต UI ยังคงราบรื่น
12) อธิบายความแตกต่างระหว่าง Syncงานแบบซิงโครนัสและอะซิงโครนัส
| ประเภท | พฤติกรรมการดำเนินการ | ตัวอย่างการใช้งาน |
|---|---|---|
| Syncมีเกียรติ | ระงับการทำงานของเธรดปัจจุบันจนกว่างานจะเสร็จสมบูรณ์ | กำลังบันทึกไฟล์ทันที |
| ไม่ตรงกัน | ทำงานในพื้นหลัง ไม่บล็อกเธรดปัจจุบัน | คำขอเครือข่าย, แอนิเมชัน |
ตัวอย่าง:
DispatchQueue.global().async {
// Asynchronous
}
DispatchQueue.main.sync {
// Synchronous
}
ปฏิบัติที่ดีที่สุด: ควรดำเนินการประมวลผลข้อมูลขนาดใหญ่แบบอะซิงโครนัสเสมอ เพื่อรักษาประสิทธิภาพการตอบสนองของ UI
13) อย่างไร SwiftUI จัดการสถานะและการไหลของข้อมูลหรือไม่?
SwiftUI ใช้ การเรนเดอร์ที่ขับเคลื่อนด้วยสถานะโดยที่ส่วนติดต่อผู้ใช้จะอัปเดตโดยอัตโนมัติเมื่อข้อมูลเปลี่ยนแปลง
นี่เป็นหนึ่งในคำถามสัมภาษณ์งานด้าน iOS ที่ได้รับความนิยมมากที่สุดในปี 2025
ตัวห่อคุณสมบัติหลัก:
| เสื้อคลุม | จุดมุ่งหมาย |
|---|---|
@State |
เก็บสถานะท้องถิ่นไว้ภายในมุมมอง |
@Binding |
สร้างการเชื่อมต่อแบบสองทางระหว่างมุมมองของผู้ปกครองและมุมมองของเด็ก |
@ObservedObject |
สังเกตการเปลี่ยนแปลงในประเภทอ้างอิงที่สอดคล้องกับ ObservableObject |
@EnvironmentObject |
ส่งต่อข้อมูลที่ใช้ร่วมกันระหว่างมุมมองต่างๆ |
ตัวอย่าง:
struct CounterView: View {
@State private var count = 0
var body: some View {
Button("Count: \(count)") {
count += 1
}
}
}
เมื่อ count การเปลี่ยนแปลง SwiftUI จะแสดงผลมุมมองใหม่โดยอัตโนมัติ
14) การปิดระบบใน... คืออะไร Swiftและมีการใช้งานอย่างไร?
A การปิด คือบล็อกฟังก์ชันการทำงานแบบครบวงในตัวเอง ซึ่งสามารถส่งผ่านและเรียกใช้งานได้ในโค้ด คล้ายกับฟังก์ชันแลมบ์ดาในภาษาโปรแกรมอื่นๆ
ตัวอย่าง:
let greet = { (name: String) -> String in
return "Hello, \(name)"
}
print(greet("John"))
การปิดล้อมจะดึงคุณค่าจากบริบทของมัน — ซึ่งเรียกว่า จับ.
มีการใช้กันอย่างแพร่หลายใน ตัวจัดการการเสร็จสิ้น แอนิเมชัน และการดำเนินการแบบอะซิงโครนัส.
ตัวอย่างการใช้งานทั่วไป:
UIView.animate(withDuration: 0.3) {
self.view.alpha = 0
}
ในที่นี้ การปิดจะกำหนดสิ่งที่เกิดขึ้นระหว่างการสร้างภาพเคลื่อนไหว
15) อธิบาย Key-Value Observing (KVO) และ Combine Framework
KVO (Key-Value Observing) เป็นกลไกที่ช่วยให้สามารถสังเกตการเปลี่ยนแปลงคุณสมบัติของวัตถุได้
รวมกันซึ่งนำเสนอในภายหลัง นำเสนอโมเดลการเขียนโปรแกรมเชิงตอบสนองที่ทันสมัย
| ลักษณะ | เควีโอ | รวมกัน |
|---|---|---|
| วากยสัมพันธ์ | อิงตาม Objective-C | Swiftการประกาศตามฐาน |
| ประเภทความปลอดภัย | อ่อนแอ | แข็งแรง |
| ได้รับการคัดเลือกในปี 2025 | ❌ | ✅ |
ตัวอย่างการรวม:
import Combine
class ViewModel: ObservableObject {
@Published var name: String = ""
}
@Published ระบบจะแจ้งเตือนสมาชิกโดยอัตโนมัติเมื่อมีการเปลี่ยนแปลงข้อมูลที่พัก
16) URLSession กับ Alamofire แตกต่างกันอย่างไร?
| แง่มุม | URL เซสชัน | อลาโมไฟร์ |
|---|---|---|
| ประเภท | เฟรมเวิร์กดั้งเดิม | ไลบรารีของบุคคลที่สาม |
| ใช้งานง่าย | ละเอียด | ย่อ |
| การปรับแต่ง | จุดสูง | ปานกลาง |
| การอยู่ที่ | ไม่มี | การพึ่งพาภายนอก |
ตัวอย่าง (URLSession):
let task = URLSession.shared.dataTask(with: url) { data, _, _ in
if let data = data {
print(String(data: data, encoding: .utf8)!)
}
}
task.resume()
ปฏิบัติที่ดีที่สุด: ใช้ URLSession สำหรับการควบคุมและการใช้งานแอปพลิเคชันขนาดเล็ก ให้ใช้ Alamofire เหมาะสำหรับการประมวลผลคำขอที่ซับซ้อน หรือแอปพลิเคชันขนาดใหญ่
17) การใช้มีข้อดีและข้อเสียอย่างไรบ้าง SwiftUI ดีกว่า UIKit ใช่ไหม?
| ปัจจัย | SwiftUI | UIKit |
|---|---|---|
| ความเร็วในการพัฒนา | ได้เร็วขึ้น | ช้าลง |
| ความเข้ากันได้ | iOS 13 ขึ้นไป | iOS 9 ขึ้นไป |
| การใช้รหัสซ้ำ | จุดสูง | ปานกลาง |
| เส้นโค้งการเรียนรู้ | สูงชัน | ง่ายขึ้นสำหรับนักพัฒนาซอฟต์แวร์รุ่นเก่า |
ข้อดีของการ SwiftUI:
- ไวยากรณ์แบบประกาศช่วยลดโค้ดซ้ำซ้อน
- การอัปเดตแบบตอบสนองอัตโนมัติช่วยลดขั้นตอนการรีเฟรชด้วยตนเอง
ข้อเสีย:
- รองรับเฉพาะ iOS เวอร์ชันเก่าเท่านั้น
- ส่วนประกอบ UI ขั้นสูงบางอย่างยังคงต้องการการเชื่อมต่อกับ UIKit อยู่
18) คุณจะเพิ่มประสิทธิภาพการทำงานของแอปใน iOS ได้อย่างไร?
การเพิ่มประสิทธิภาพการทำงานเป็นประเด็นสำคัญในการสัมภาษณ์งานสำหรับนักพัฒนาซอฟต์แวร์ที่มีประสบการณ์
กลยุทธ์ที่สำคัญ:
- ใช้เครื่องมือ เพื่อตรวจจับการรั่วไหลของหน่วยความจำและการวิเคราะห์เวลาการทำงาน
- เลื่อนงานหนักออกไป ไปยังคิวพื้นหลัง (GCD)
- นำเซลล์กลับมาใช้ใหม่ ในมุมมองตาราง/คอลเลกชัน
- แคชการตอบสนองของเครือข่าย และภาพ
- การโหลดภาพแบบขี้เกียจ โดยใช้กรอบงานเช่น
Kingfisher.
ตัวอย่าง:
imageView.kf.setImage(with: URL(string: imageUrl))
สาธิตการโหลดรูปภาพแบบอะซิงโครนัสและแคชไว้ เพื่อเพิ่มความลื่นไหลในการใช้งาน UI
19) การแจ้งเตือนใน iOS มีกี่ประเภท?
| ประเภท | Descriptไอออน | ตัวอย่าง |
|---|---|---|
| การแจ้งเตือนในพื้นที่ | ถูกกระตุ้นโดยแอป | การแจ้งเตือน, กิจกรรมในปฏิทิน |
| การแจ้งเตือนระยะไกล (แบบพุช) | ส่งผ่าน APN จากเซิร์ฟเวอร์ | ข้อความแชท |
| การแจ้งเตือนในแอป | แสดงเมื่อผู้ใช้กำลังใช้งานอยู่ | ข้อความอวยพร |
ตัวอย่าง:
UNUserNotificationCenter.current().add(request)
เคล็ดลับการสัมภาษณ์: ระบุว่า iOS 15 ขึ้นไปมีระดับการขัดจังหวะการแจ้งเตือน (เช่น แบบแอคทีฟ แบบพาสซีฟ แบบจำกัดเวลา) เพื่อปรับปรุงประสบการณ์การใช้งานของผู้ใช้
20) โครงสร้าง (Struct) และคลาส (Class) แตกต่างกันอย่างไรใน Swift?
| ลักษณะ | โครงสร้าง | ชั้น |
|---|---|---|
| ประเภท | ประเภทค่า | ประเภทการอ้างอิง |
| มรดก | ไม่ได้รับการสนับสนุน | ที่สนับสนุน |
| การจัดสรรหน่วยความจำ | กอง | กอง |
| การกลายพันธุ์ | ต้องใช้ var |
สามารถเปลี่ยนแปลงคุณสมบัติได้อย่างอิสระ |
| ใช้กรณี | รุ่นน้ำหนักเบา | วัตถุที่ซับซ้อนที่มีสถานะร่วมกัน |
ตัวอย่าง:
struct Point { var x: Int; var y: Int }
class Shape { var color: String = "Red" }
ใช้ โครงสร้าง เพื่อความไม่เปลี่ยนแปลงและประสิทธิภาพ; ใช้ ชั้นเรียน สำหรับสถานะที่ใช้ร่วมกันและการสืบทอด
21) วิธีการทั่วไปในการดีบักแอปพลิเคชัน iOS อย่างมีประสิทธิภาพมีอะไรบ้าง?
การดีบักใน iOS ผสานรวมทั้งสองอย่างเข้าด้วยกัน Xcode เครื่องมือ และ กรอบการวินิจฉัย.
เทคนิค:
- จุดพัก: ใช้เบรกพอยต์แบบมีเงื่อนไขหรือแบบสัญลักษณ์เพื่อการระบุตำแหน่งเบรกพอยต์ที่แม่นยำยิ่งขึ้น
- คำสั่ง LLDB: ตรวจสอบตัวแปร (
po,p,bt). - Xcode เครื่องดนตรี: ตรวจสอบปัญหาหน่วยความจำรั่วไหล การใช้งาน CPU หรือปัญหาคอขวดด้านประสิทธิภาพ
- OSLog / การบันทึกข้อมูลแบบรวมศูนย์: ใช้
LoggerAPI แทนที่จะเป็นprint()เพื่อประสิทธิภาพและการกรองที่ดีขึ้น
ตัวอย่าง:
import OSLog
let logger = Logger(subsystem: "com.app.debug", category: "network")
logger.info("Network call started")
เคล็ดลับ Pro: กล่าวในการสัมภาษณ์ว่าคุณใช้ เครื่องมือ + โปรไฟล์เวลา เพื่อวัดประสิทธิภาพในระดับฟังก์ชันสำหรับการปรับปรุงให้เหมาะสม ซึ่งเป็นคุณสมบัติเด่นของนักพัฒนาอาวุโส
22) Dependency Injection คืออะไร และมีประโยชน์อย่างไร Swift?
การพึ่งพาการฉีด (DI) เป็นรูปแบบการออกแบบที่ใช้เพื่อปรับปรุงความเป็นโมดูลของโค้ด ความสามารถในการทดสอบ และความสามารถในการบำรุงรักษา
แทนที่จะสร้างการพึ่งพาภายใน คุณจะใช้วิธีการฉีดการพึ่งพาจากภายนอกแทน
ประเภทของ DI:
| ประเภท | ตัวอย่าง |
|---|---|
| คอนสตรัคอินเจ็คชั่น | ฉีดผ่านตัวเริ่มต้น |
| การฉีดทรัพย์สิน | กำหนดการพึ่งพาหลังจากสร้างเสร็จแล้ว |
| วิธีการฉีด | ส่งค่าการพึ่งพาเป็นพารามิเตอร์ของเมธอด |
ตัวอย่าง:
class NetworkManager {
func fetchData() {}
}
class ViewModel {
let manager: NetworkManager
init(manager: NetworkManager) {
self.manager = manager
}
}
แนวทางนี้ทำให้ง่ายขึ้น การทดสอบหน่วย โดยอนุญาตให้มีการฉีดการพึ่งพาจำลอง (mock dependency)
23) การเขียนโปรแกรมเชิงโปรโตคอล (Protocol-Oriented Programming หรือ POP) คืออะไร และมีประโยชน์อย่างไร?
Swift ส่งเสริม การเขียนโปรแกรมเชิงโปรโตคอล (POP) — รูปแบบที่เน้นย้ำ โปรโตคอลเหนือการสืบทอด.
ประโยชน์ที่ได้รับ:
- การนำกลับมาใช้ใหม่: พฤติกรรมร่วมกันผ่านส่วนขยายของโปรโตคอล
- ส่วนประกอบ: ผสมผสานพฤติกรรมหลายอย่างได้อย่างยืดหยุ่น
- ความสามารถในการทดสอบ: การจำลอง (mocking) ในการทดสอบหน่วย (unit test) ทำได้ง่ายขึ้น
- ลดความซับซ้อนของการสืบทอดทางพันธุกรรม
ตัวอย่าง:
protocol Flyable { func fly() }
extension Flyable { func fly() { print("Flying") } }
struct Bird: Flyable {}
Bird().fly()
แทนที่จะใช้ลำดับชั้นของคลาส วิธีนี้ใช้การประกอบโปรโตคอล ซึ่งช่วยเพิ่มความสามารถในการขยายขนาด
24) อย่างไร Swift จัดการข้อผิดพลาดอย่างไร?
Swift ใช้ a โด-ทรี-แคช กลไกสำหรับการจัดการข้อผิดพลาด ทำให้โค้ดปลอดภัยและชัดเจนยิ่งขึ้น
ตัวอย่าง:
enum NetworkError: Error {
case badURL, requestFailed
}
func fetchData() throws {
throw NetworkError.badURL
}
do {
try fetchData()
} catch {
print("Error occurred: \(error)")
}
ความแตกต่างที่สำคัญระหว่างข้อผิดพลาดแบบ Throwing และ Optional Errors:
| วิธี | คืนสินค้า | กรณีใช้งานที่ดีที่สุด |
|---|---|---|
throws |
แพร่กระจายข้อผิดพลาด | งานที่สำคัญ |
try? |
การส่งคืนข้อมูลเป็นทางเลือก | ไม่สำคัญ |
try! |
บังคับแกะ | เฉพาะเมื่อรับประกันความปลอดภัยแล้วเท่านั้น |
ปฏิบัติที่ดีที่สุด: หลีกเลี่ยง try! ยกเว้นในช่วงการเขียนโค้ดต้นแบบ ควรใช้การจัดการข้อผิดพลาดแบบมีโครงสร้างเพื่อความน่าเชื่อถือ
25) คุณสมบัติหลักบางประการที่นำเสนอในมีอะไรบ้าง Swift 6 (คาดการณ์ปี 2025)?
Swift 6 เน้นย้ำ ความปลอดภัย การทำงานพร้อมกัน และประสิทธิภาพการทำงานข้ามแพลตฟอร์ม.
| Category | ลักษณะ | Descriptไอออน |
|---|---|---|
| เห็นพ้องด้วย | พิมพ์ Task การยกเลิก |
ควบคุมวงจรชีวิตของงานได้มากขึ้น |
| พิมพ์ระบบ | ประเภทการดำรงอยู่ทั่วไป | ยาสามัญที่สะอาดกว่า |
| ความปลอดภัยของหน่วยความจำ | รูปแบบการเป็นเจ้าของ | ป้องกันปัญหาการแย่งชิงข้อมูล (Data Race) |
| การขับรถ | Swift แมโคร | เมตาโปรแกรมมิ่งในขั้นตอนการคอมไพล์ |
ตัวอย่าง:
@freestanding(expression) macro log(_ message: String) = #externalMacro(module: "LoggerMacros", type: "LoggerMacro")
ฟีเจอร์มาโครนี้ช่วยลดโค้ดซ้ำซ้อนสำหรับการบันทึกและตรวจสอบความถูกต้อง ซึ่งเป็นข้อดีสำคัญที่ผู้สัมภาษณ์อาจพิจารณาในการอัปเกรดระบบ
26) วิธีการจัดการการพึ่งพา (Dependency) ในโปรเจ็กต์ iOS ที่นิยมใช้กันมีอะไรบ้าง?
| เครื่องมือ | Descriptไอออน | หมายเหตุ : |
|---|---|---|
| โกโก้พอดส์ | ตัวจัดการการพึ่งพาที่ได้รับความนิยมโดยใช้ Podfiles | ใช้งานง่ายแต่ช้า |
| คาร์เธจ | สร้างเฟรมเวิร์กภายนอกโครงการ | น้ำหนักเบาและยืดหยุ่น |
| Swift ตัวจัดการแพ็กเกจ (SPM) | รวมอยู่ใน Xcode | เป็นทางการและเป็นที่นิยมในปี 2025 |
ตัวอย่าง (SPM):
dependencies: [
.package(url: "https://github.com/Alamofire/Alamofire.git", from: "5.6.0")
]
เคล็ดลับ Pro: ระบุในระหว่างการสัมภาษณ์ว่าคุณชอบอะไรเป็นพิเศษ SPM เพื่อความทันสมัย Swift โครงการต่างๆ เนื่องจากการผสานรวมอย่างลงตัวและค่าใช้จ่ายในการดำเนินการน้อยที่สุด
27) คุณนำการทดสอบหน่วย (Unit Testing) และการทดสอบ UI (UI Testing) มาใช้ใน iOS อย่างไร?
การทดสอบช่วยให้มั่นใจได้ถึงความน่าเชื่อถือและความสามารถในการบำรุงรักษาของโค้ด ซึ่งเป็นสิ่งจำเป็นอย่างยิ่งสำหรับการสัมภาษณ์งานตำแหน่งนักพัฒนา iOS ระดับสูง
ประเภทของการทดสอบ:
| ประเภท | กรอบ | จุดมุ่งหมาย |
|---|---|---|
| การทดสอบหน่วย | เอ็กซ์ซีเทสต์ | ทดสอบหน่วยตรรกะขนาดเล็ก |
| การทดสอบ UI | XCTest UI | ทดสอบการโต้ตอบของส่วนติดต่อผู้ใช้ |
ตัวอย่าง:
func testAddNumbers() {
XCTAssertEqual(add(2, 3), 5)
}
ตัวอย่างการทดสอบ UI:
let app = XCUIApplication() app.buttons["Login"].tap() XCTAssertTrue(app.staticTexts["Welcome"].exists)
ปฏิบัติที่ดีที่สุด: ติดตาม AAA (จัดเตรียม-ดำเนินการ-ยืนยัน) รูปแบบเพื่อความชัดเจนและความคาดเดาได้ในการทดสอบ
28) Keychain คืออะไร และใช้สำหรับการจัดเก็บข้อมูลอย่างปลอดภัยได้อย่างไร?
พวงกุญแจ เป็นระบบจัดเก็บข้อมูลที่ปลอดภัยซึ่งเป็นส่วนหนึ่งของ iOS สำหรับจัดเก็บข้อมูลสำคัญขนาดเล็ก เช่น โทเค็น รหัสผ่าน หรือใบรับรอง
ข้อดี:
- การเข้ารหัสที่จัดการโดยระบบ
- การซิงโครไนซ์อัตโนมัติกับ iCloud พวงกุญแจ (ไม่จำเป็น)
- คงค่าไว้แม้หลังจากถอนการติดตั้งแอป (หากตั้งค่าไว้)
ตัวอย่าง:
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: "userToken",
kSecValueData as String: token.data(using: .utf8)!
]
SecItemAdd(query as CFDictionary, nil)
ปฏิบัติที่ดีที่สุด: ใช้ KeychainAccess ตัวห่อหุ้มเพื่อความเรียบง่ายและการปฏิบัติตามกฎระเบียบด้านความปลอดภัยในการเขียนโค้ด
29) อธิบายบทบาทของ SceneDelegate และความแตกต่างระหว่าง SceneDelegate กับ AppDelegate
ตั้งแต่ iOS 13 เป็นต้นมา Apple ได้เปิดตัวผลิตภัณฑ์ใหม่หลายรายการ ตัวแทนฉาก สำหรับการจัดการหลายหน้าต่างและสถานะต่างๆ
| ตัวแทน | จุดมุ่งหมาย |
|---|---|
| AppDelegate | จัดการวงจรชีวิตระดับแอปพลิเคชัน (การเปิดใช้งาน การทำงานเบื้องหลัง การยุติการทำงาน) |
| ตัวแทนฉาก | จัดการวงจรชีวิตของฉาก UI (เมื่อผู้ใช้สลับระหว่างหน้าต่าง/ฉากต่างๆ) |
ตัวอย่างหน้าที่ความรับผิดชอบ:
AppDelegateลงทะเบียนเพื่อรับการแจ้งเตือนแบบพุช และเริ่มต้นใช้งาน SDKSceneDelegate: จัดการการกู้คืน UI และการบันทึกสถานะ
ตัวอย่างรหัส:
func sceneDidEnterBackground(_ scene: UIScene) {
saveContext()
}
เคล็ดลับ Pro: กล่าวในการสัมภาษณ์ว่า SceneDelegate มีความสำคัญอย่างยิ่งสำหรับแอปพลิเคชันที่มีหลายฉากบน iPad และ macOS ตัวเร่ง.
30) แนวทางปฏิบัติที่ดีที่สุดด้านความปลอดภัยทั่วไปสำหรับแอปพลิเคชัน iOS มีอะไรบ้าง?
เรื่องความปลอดภัยเป็นหัวข้อสำคัญในการสัมภาษณ์รอบสุดท้าย
แนวทางปฏิบัติที่สำคัญ:
- ใช้ Keychain สำหรับข้อมูลที่สำคัญ
- เปิดใช้งานการรักษาความปลอดภัยการขนส่งแอป (ATS) — จำกัดจำนวนคำขอ HTTP
- ใช้การเข้ารหัสแบบปกปิด (Code Obfuscation) เพื่อป้องกันตรรกะจากการวิศวกรรมย้อนกลับ
- ใช้งาน SSL Pinning เพื่อป้องกันการโจมตีแบบคนกลาง (man-in-the-middle attacks)
- จำกัดการจับภาพหน้าจอและการบันทึกหน้าจอ ในบริเวณที่มีความอ่อนไหว
ตัวอย่าง:
UIApplication.shared.isProtectedDataAvailable
เคล็ดลับโบนัส: สนทนา ความปลอดภัย.เฟรมเวิร์ก และ คริปโตคิท — พวกเขาแสดงให้เห็นถึงความเข้าใจใน API การเข้ารหัสสมัยใหม่
🔍 คำถามสัมภาษณ์งาน iOS ยอดนิยม พร้อมสถานการณ์จริงและคำตอบเชิงกลยุทธ์
1) คุณจะอธิบายรูปแบบ MVC ใน iOS อย่างไร และทำไมมันถึงสำคัญ?
สิ่งที่คาดหวังจากผู้สมัคร: ผู้สัมภาษณ์ต้องการประเมินความเข้าใจของคุณเกี่ยวกับรูปแบบสถาปัตยกรรมพื้นฐานของ iOS และความสามารถในการอธิบายรูปแบบเหล่านั้นได้อย่างชัดเจน
ตัวอย่างคำตอบ: รูปแบบ Model-View-Controller (MView-Controller) แยกส่วนตรรกะข้อมูล ส่วนติดต่อผู้ใช้ และการควบคุมการทำงานออกจากกัน ใน iOS รูปแบบนี้ช่วยให้โค้ดเป็นระเบียบและดูแลรักษาง่ายขึ้น Model ทำหน้าที่จัดการข้อมูล View ทำหน้าที่แสดงผล และ Controller ทำหน้าที่ประสานงานระหว่างทั้งสองส่วน ซึ่งช่วยเพิ่มความสามารถในการทดสอบและขยายขนาด
2) ความแตกต่างระหว่างการอ้างอิงที่แข็งแกร่ง การอ้างอิงที่อ่อนแอ และการอ้างอิงที่ไม่มีเจ้าของคืออะไร Swift?
สิ่งที่คาดหวังจากผู้สมัคร: ผู้สัมภาษณ์ต้องการทดสอบความรู้ของคุณเกี่ยวกับการจัดการหน่วยความจำ และความสามารถของคุณในการป้องกันไม่ให้เกิดวงจรการจดจำข้อมูลซ้ำซ้อน
ตัวอย่างคำตอบ: การอ้างอิงแบบแข็งแกร่ง (Strong references) จะเพิ่มจำนวนการอ้างอิงและทำให้วัตถุคงอยู่ต่อไป การอ้างอิงแบบอ่อนแอ (Weak references) จะไม่เพิ่มจำนวนการอ้างอิงและจะกลายเป็นค่าว่างโดยอัตโนมัติเมื่อวัตถุถูกยกเลิกการจัดสรร การอ้างอิงที่ไม่มีเจ้าของ (Unowned references) ก็จะไม่เพิ่มจำนวนการอ้างอิงเช่นกัน แต่จะถือว่าวัตถุนั้นจะมีอยู่เสมอ ซึ่งอาจทำให้โปรแกรมหยุดทำงานหากใช้งานไม่ถูกต้อง
3) อธิบายสถานการณ์ที่คุณต้องแก้ไขข้อผิดพลาดที่ซับซ้อนในแอปพลิเคชัน iOS
สิ่งที่คาดหวังจากผู้สมัคร: ผู้สัมภาษณ์ต้องการทราบถึงแนวทางการแก้ปัญหาและทักษะการแก้ไขข้อผิดพลาดของคุณ
ตัวอย่างคำตอบ: ในบทบาทก่อนหน้านี้ ผมพบปัญหาโปรแกรมล่มที่เกี่ยวข้องกับการทำงานแบบมัลติเธรด ผมจึงวิเคราะห์บันทึกข้อผิดพลาดโดยใช้ Xcode และเครื่องมือต่างๆ ได้ระบุสภาวะการแข่งขัน (race condition) และแก้ไขปัญหาโดยการซิงโครไนซ์ทรัพยากรที่ใช้ร่วมกัน วิธีนี้ช่วยลดการหยุดทำงานและเพิ่มเสถียรภาพของแอปพลิเคชัน
4) คุณจัดการกับการผสานรวม API และการจัดการข้อผิดพลาดในแอป iOS อย่างไร?
สิ่งที่คาดหวังจากผู้สมัคร: ผู้สัมภาษณ์กำลังประเมินประสบการณ์ของคุณเกี่ยวกับการสร้างเครือข่ายและการออกแบบแอปพลิเคชันที่มีความยืดหยุ่น
ตัวอย่างคำตอบ: โดยปกติผมจะใช้ URLSession สำหรับการเรียก API และกำหนดโมเดลข้อมูลที่ชัดเจนโดยใช้ Codable ในตำแหน่งงานก่อนหน้านี้ ผมได้นำระบบจัดการข้อผิดพลาดแบบรวมศูนย์มาใช้เพื่อจัดการกับความล้มเหลวของเครือข่าย การตอบสนองที่ไม่ถูกต้อง และการหมดเวลา เพื่อให้มั่นใจว่าผู้ใช้จะได้รับข้อมูลตอบกลับที่มีความหมายเสมอ
5) คุณดำเนินการอย่างไรบ้างเพื่อเพิ่มประสิทธิภาพการทำงานของแอป iOS?
สิ่งที่คาดหวังจากผู้สมัคร: ผู้สัมภาษณ์ต้องการทราบว่าคุณระบุและแก้ไขปัญหาคอขวดด้านประสิทธิภาพได้อย่างไร
ตัวอย่างคำตอบ: ผมเน้นการลดการอัปเดตมุมมองที่ไม่จำเป็น การเพิ่มประสิทธิภาพมุมมองตารางและคอลเลกชัน และการลดการใช้หน่วยความจำให้เหลือน้อยที่สุด ในงานก่อนหน้านี้ ผมใช้ Instruments เพื่อตรวจจับการรั่วไหลของหน่วยความจำและการใช้งาน CPU ที่มากเกินไป ซึ่งส่งผลให้ประสิทธิภาพดีขึ้นอย่างเห็นได้ชัด
6) คุณมั่นใจได้อย่างไรว่าแอปพลิเคชัน iOS ของคุณสามารถเข้าถึงได้?
สิ่งที่คาดหวังจากผู้สมัคร: ผู้สัมภาษณ์กำลังประเมินความเข้าใจของคุณเกี่ยวกับหลักการออกแบบที่ครอบคลุมและแนวทางปฏิบัติของแพลตฟอร์ม
ตัวอย่างคำตอบ: ฉันปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดด้านการเข้าถึงโดยใช้การพิมพ์แบบไดนามิก ป้ายกำกับการเข้าถึงที่เหมาะสม และการรองรับ VoiceOver นอกจากนี้ ฉันยังทดสอบแอปพลิเคชันโดยใช้เครื่องมือการเข้าถึงที่ Apple จัดหาให้เพื่อให้แน่ใจว่าสอดคล้องกับแนวทางของพวกเขา
7) เล่าสถานการณ์ที่ข้อกำหนดเปลี่ยนแปลงในช่วงท้ายของการพัฒนาให้ฟังหน่อย
สิ่งที่คาดหวังจากผู้สมัคร: ผู้สัมภาษณ์ต้องการประเมินความสามารถในการปรับตัวและทักษะการสื่อสาร
ตัวอย่างคำตอบ: ในบทบาทล่าสุดของฉัน ข้อกำหนดด้านฟีเจอร์หนึ่งเปลี่ยนแปลงไปไม่นานก่อนการปล่อยเวอร์ชันใหม่ ฉันจึงประเมินลำดับความสำคัญใหม่ สื่อสารข้อแลกเปลี่ยนกับผู้มีส่วนได้ส่วนเสีย และปรับปรุงเฉพาะส่วนประกอบที่จำเป็นเท่านั้น ซึ่งทำให้เราสามารถทำตามกำหนดเวลาได้โดยไม่ลดทอนคุณภาพ
8) คุณจัดการสถานะในแอปพลิเคชัน iOS ที่ซับซ้อนอย่างไร?
สิ่งที่คาดหวังจากผู้สมัคร: ผู้สัมภาษณ์มองหาความคิดเชิงสถาปัตยกรรมและประสบการณ์ในการพัฒนาแอปพลิเคชันที่ปรับขนาดได้
ตัวอย่างคำตอบ: ฉันจัดการสถานะโดยการกำหนดการไหลของข้อมูลอย่างชัดเจน และใช้รูปแบบต่างๆ เช่น การมอบหมายงาน การแจ้งเตือน หรือเฟรมเวิร์กแบบตอบสนองเมื่อเหมาะสม ซึ่งจะช่วยให้พฤติกรรมคาดเดาได้และแก้ไขข้อผิดพลาดได้ง่ายขึ้นเมื่อแอปพลิเคชันเติบโตขึ้น
9) คุณใช้กลยุทธ์การทดสอบอะไรบ้างในการพัฒนาแอปพลิเคชัน iOS?
สิ่งที่คาดหวังจากผู้สมัคร: ผู้สัมภาษณ์ต้องการเข้าใจถึงความมุ่งมั่นของคุณต่อคุณภาพและความน่าเชื่อถือ
ตัวอย่างคำตอบ: ฉันใช้ Unit Test สำหรับตรรกะทางธุรกิจ, UI Test สำหรับขั้นตอนการใช้งานที่สำคัญ และ Continuous Integration เพื่อรันการทดสอบโดยอัตโนมัติ การผสมผสานนี้ช่วยให้ตรวจพบปัญหาได้ตั้งแต่เนิ่นๆ และรักษาคุณภาพโค้ดในระยะยาว
10) คุณติดตามเทรนด์และการอัปเดตการพัฒนา iOS อย่างไร?
สิ่งที่คาดหวังจากผู้สมัคร: ผู้สัมภาษณ์กำลังประเมินความมุ่งมั่นของคุณในการเรียนรู้อย่างต่อเนื่อง
ตัวอย่างคำตอบ: ฉันติดตามเอกสารทางการ การประชุมนักพัฒนา และบล็อกที่น่าเชื่อถือเป็นประจำ นอกจากนี้ ฉันยังทดลองใช้ API ใหม่ๆ ในโปรเจกต์ส่วนตัว ซึ่งช่วยให้ฉันปรับตัวเข้ากับการเปลี่ยนแปลงของแพลตฟอร์มได้อย่างรวดเร็ว และนำโซลูชันที่ทันสมัยมาใช้ในแอปพลิเคชันที่ใช้งานจริงได้
