跳到主要内容

iOS and macOS Development

UIKit Fundamentals

View Controllers

class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
}

private func setupUI() {
let label = UILabel()
label.text = "Hello, iOS!"
label.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(label)

NSLayoutConstraint.activate([
label.centerXAnchor.constraint(equalTo: view.centerXAnchor),
label.centerYAnchor.constraint(equalTo: view.centerYAnchor)
])
}
}

Auto Layout

// Programmatic constraints
let button = UIButton(type: .system)
button.setTitle("Tap Me", for: .normal)
button.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(button)

NSLayoutConstraint.activate([
button.topAnchor.constraint(equalTo: label.bottomAnchor, constant: 20),
button.centerXAnchor.constraint(equalTo: view.centerXAnchor),
button.widthAnchor.constraint(equalToConstant: 100),
button.heightAnchor.constraint(equalToConstant: 44)
])

AppKit for macOS

Window Controllers

class MainWindowController: NSWindowController {
override func windowDidLoad() {
super.windowDidLoad()

window?.title = "My macOS App"
window?.setContentSize(NSSize(width: 800, height: 600))
}
}

View Controllers

class ViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()

let button = NSButton(title: "Click Me",
target: self,
action: #selector(buttonClicked))
button.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(button)

NSLayoutConstraint.activate([
button.centerXAnchor.constraint(equalTo: view.centerXAnchor),
button.centerYAnchor.constraint(equalTo: view.centerYAnchor)
])
}

@objc private func buttonClicked() {
let alert = NSAlert()
alert.messageText = "Button Clicked"
alert.runModal()
}
}

Core Data

Data Model

// Person+CoreDataClass.swift
import CoreData

@objc(Person)
public class Person: NSManagedObject {
@NSManaged public var name: String?
@NSManaged public var age: Int16
@NSManaged public var email: String?
}

Core Data Operations

class DataManager {
static let shared = DataManager()

lazy var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "MyApp")
container.loadPersistentStores { description, error in
if let error = error {
fatalError("Unable to load persistent stores: \(error)")
}
}
return container
}()

func savePerson(name: String, age: Int16, email: String) {
let context = persistentContainer.viewContext
let person = Person(context: context)
person.name = name
person.age = age
person.email = email

do {
try context.save()
} catch {
print("Failed to save person: \(error)")
}
}
}

Networking

URLSession

class NetworkManager {
static let shared = NetworkManager()

func fetchData<T: Decodable>(from url: URL) async throws -> T {
let (data, response) = try await URLSession.shared.data(from: url)

guard let httpResponse = response as? HTTPURLResponse,
(200...299).contains(httpResponse.statusCode) else {
throw NetworkError.invalidResponse
}

let decoder = JSONDecoder()
return try decoder.decode(T.self, from: data)
}
}

// Usage
struct User: Codable {
let id: Int
let name: String
let email: String
}

Task {
do {
let user: User = try await NetworkManager.shared.fetchData(from: url)
print("Fetched user: \(user.name)")
} catch {
print("Error fetching user: \(error)")
}
}

Next Steps

  1. Explore SwiftUI and UIKit in detail
  2. Learn about Performance Optimization
  3. Study Security Best Practices