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

คำถามและคำตอบสัมภาษณ์งานด้าน iOS ยอดนิยม

การเตรียมตัวสำหรับงานด้าน 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 ได้อย่างไร?

การเพิ่มประสิทธิภาพการทำงานเป็นประเด็นสำคัญในการสัมภาษณ์งานสำหรับนักพัฒนาซอฟต์แวร์ที่มีประสบการณ์

กลยุทธ์ที่สำคัญ:

  1. ใช้เครื่องมือ เพื่อตรวจจับการรั่วไหลของหน่วยความจำและการวิเคราะห์เวลาการทำงาน
  2. เลื่อนงานหนักออกไป ไปยังคิวพื้นหลัง (GCD)
  3. นำเซลล์กลับมาใช้ใหม่ ในมุมมองตาราง/คอลเลกชัน
  4. แคชการตอบสนองของเครือข่าย และภาพ
  5. การโหลดภาพแบบขี้เกียจ โดยใช้กรอบงานเช่น 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 เครื่องมือ และ กรอบการวินิจฉัย.

เทคนิค:

  1. จุดพัก: ใช้เบรกพอยต์แบบมีเงื่อนไขหรือแบบสัญลักษณ์เพื่อการระบุตำแหน่งเบรกพอยต์ที่แม่นยำยิ่งขึ้น
  2. คำสั่ง LLDB: ตรวจสอบตัวแปร (po, p, bt).
  3. Xcode เครื่องดนตรี: ตรวจสอบปัญหาหน่วยความจำรั่วไหล การใช้งาน CPU หรือปัญหาคอขวดด้านประสิทธิภาพ
  4. OSLog / การบันทึกข้อมูลแบบรวมศูนย์: ใช้ Logger API แทนที่จะเป็น 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) — รูปแบบที่เน้นย้ำ โปรโตคอลเหนือการสืบทอด.

ประโยชน์ที่ได้รับ:

  1. การนำกลับมาใช้ใหม่: พฤติกรรมร่วมกันผ่านส่วนขยายของโปรโตคอล
  2. ส่วนประกอบ: ผสมผสานพฤติกรรมหลายอย่างได้อย่างยืดหยุ่น
  3. ความสามารถในการทดสอบ: การจำลอง (mocking) ในการทดสอบหน่วย (unit test) ทำได้ง่ายขึ้น
  4. ลดความซับซ้อนของการสืบทอดทางพันธุกรรม

ตัวอย่าง:

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ลงทะเบียนเพื่อรับการแจ้งเตือนแบบพุช และเริ่มต้นใช้งาน SDK
  • SceneDelegate: จัดการการกู้คืน UI และการบันทึกสถานะ

ตัวอย่างรหัส:

func sceneDidEnterBackground(_ scene: UIScene) {
    saveContext()
}

เคล็ดลับ Pro: กล่าวในการสัมภาษณ์ว่า SceneDelegate มีความสำคัญอย่างยิ่งสำหรับแอปพลิเคชันที่มีหลายฉากบน iPad และ macOS ตัวเร่ง.


30) แนวทางปฏิบัติที่ดีที่สุดด้านความปลอดภัยทั่วไปสำหรับแอปพลิเคชัน iOS มีอะไรบ้าง?

เรื่องความปลอดภัยเป็นหัวข้อสำคัญในการสัมภาษณ์รอบสุดท้าย

แนวทางปฏิบัติที่สำคัญ:

  1. ใช้ Keychain สำหรับข้อมูลที่สำคัญ
  2. เปิดใช้งานการรักษาความปลอดภัยการขนส่งแอป (ATS) — จำกัดจำนวนคำขอ HTTP
  3. ใช้การเข้ารหัสแบบปกปิด (Code Obfuscation) เพื่อป้องกันตรรกะจากการวิศวกรรมย้อนกลับ
  4. ใช้งาน SSL Pinning เพื่อป้องกันการโจมตีแบบคนกลาง (man-in-the-middle attacks)
  5. จำกัดการจับภาพหน้าจอและการบันทึกหน้าจอ ในบริเวณที่มีความอ่อนไหว

ตัวอย่าง:

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 ใหม่ๆ ในโปรเจกต์ส่วนตัว ซึ่งช่วยให้ฉันปรับตัวเข้ากับการเปลี่ยนแปลงของแพลตฟอร์มได้อย่างรวดเร็ว และนำโซลูชันที่ทันสมัยมาใช้ในแอปพลิเคชันที่ใช้งานจริงได้

สรุปโพสต์นี้ด้วย: