Nhập dữ liệu với readLine()
1. readLine() - Đọc một dòng input
Phần tiêu đề “1. readLine() - Đọc một dòng input”Swift dùng hàm readLine() để đọc input từ bàn phím (command-line/script). Hàm này trả về String? (Optional), vì có thể không đọc được gì (EOF).
print("Nhập tên của bạn:")if let name = readLine() { print("Xin chào, \(name)!")}Console:
Nhập tên của bạn:BumbiiXin chào, Bumbii!2. Xử lý Optional trả về
Phần tiêu đề “2. Xử lý Optional trả về”// Cách 1: Optional bindingif let input = readLine(), !input.isEmpty { print("Bạn đã nhập: \(input)")} else { print("Bạn chưa nhập gì!")}
// Cách 2: Nil-coalescing với giá trị mặc địnhlet input = readLine() ?? ""print("Input: \(input)")3. Đọc và parse số
Phần tiêu đề “3. Đọc và parse số”print("Nhập tuổi: ", terminator: "")
if let ageInput = readLine(), let age = Int(ageInput) { print("Bạn \(age) tuổi, năm sau bạn \(age + 1) tuổi")} else { print("Tuổi không hợp lệ!")}Parse Double
Phần tiêu đề “Parse Double”print("Nhập cân nặng (kg): ", terminator: "")let weight = Double(readLine() ?? "") ?? 0.0
print("Nhập chiều cao (m): ", terminator: "")let height = Double(readLine() ?? "") ?? 0.0
if weight > 0 && height > 0 { let bmi = weight / (height * height) print("BMI của bạn: \(String(format: "%.2f", bmi))")} else { print("Dữ liệu không hợp lệ!")}4. Pattern: Lặp cho đến khi input hợp lệ
Phần tiêu đề “4. Pattern: Lặp cho đến khi input hợp lệ”var age: Int? = nil
while age == nil { print("Nhập tuổi (số nguyên dương): ", terminator: "") if let value = Int(readLine() ?? ""), value > 0 { age = value } else { print("❌ Vui lòng nhập số nguyên dương!") }}
print("✅ Tuổi của bạn là: \(age!)")5. Đọc nhiều giá trị từ một dòng
Phần tiêu đề “5. Đọc nhiều giá trị từ một dòng”print("Nhập 2 số (cách nhau bởi dấu cách): ", terminator: "")
let parts = (readLine() ?? "").split(separator: " ")let a = parts.count > 0 ? Int(parts[0]) ?? 0 : 0let b = parts.count > 1 ? Int(parts[1]) ?? 0 : 0
print("\(a) + \(b) = \(a + b)")Console:
Nhập 2 số (cách nhau bởi dấu cách): 10 2010 + 20 = 30Map sang mảng số
Phần tiêu đề “Map sang mảng số”print("Nhập 3 số (cách nhau bởi dấu cách): ", terminator: "")
let numbers = (readLine() ?? "") .split(separator: " ") .compactMap { Int($0) }
let total = numbers.reduce(0, +)print("Tổng: \(total)")print("Trung bình: \(Double(total) / Double(numbers.count))")6. Đọc nhiều dòng
Phần tiêu đề “6. Đọc nhiều dòng”print("Nhập các số (nhập 'done' để kết thúc):")
var numbers: [Int] = []
while let input = readLine(), input != "done" { if let n = Int(input) { numbers.append(n) }}
print("Các số đã nhập: \(numbers)")print("Tổng: \(numbers.reduce(0, +))")🛠️ Thực hành
Phần tiêu đề “🛠️ Thực hành”Bài tập: Máy tính đơn giản
// TODO: Nhập 2 số và phép tính (+, -, *, /)// TODO: Tính và in kết quảLời giải:
print("Nhập số thứ nhất: ", terminator: "")let a = Double(readLine() ?? "") ?? 0.0
print("Nhập phép tính (+, -, *, /): ", terminator: "")let op = readLine() ?? ""
print("Nhập số thứ hai: ", terminator: "")let b = Double(readLine() ?? "") ?? 0.0
let result: Double?switch op {case "+": result = a + bcase "-": result = a - bcase "*": result = a * bcase "/": result = b != 0 ? a / b : nildefault: result = nil}
if let result { print("Kết quả: \(a) \(op) \(b) = \(result)")} else { print("Phép tính không hợp lệ!")}⚠️ Lưu ý quan trọng
Phần tiêu đề “⚠️ Lưu ý quan trọng”readLine()chỉ hoạt động khi chạy Swift dạng command-line/script (Swift Package,swift run, hoặc file.swiftchạy trực tiếp) — không dùng được trong app iOS/SwiftUI, vì ứng dụng nhận input qua UI (TextField,Button…).- Luôn
trimkhoảng trắng thừa khi cần so khớp chuỗi chính xác:input.trimmingCharacters(in: .whitespaces). readLine()trả vềnilkhi gặp EOF (ví dụ input được pipe từ file và đã hết dữ liệu) — luôn xử lý trường hợp này thay vì force-unwrap (readLine()!).
// SwiftUI - không dùng readLine(), nhận input qua TextFieldstruct ContentView: View { @State private var name: String = ""
var body: some View { VStack { TextField("Nhập tên", text: $name) Text("Xin chào, \(name)!") } .padding() }}📝 Tóm tắt
Phần tiêu đề “📝 Tóm tắt”readLine()trả vềString?- luôn xử lý Optional- Parse số với
Int(...),Double(...)(cũng trả về Optional) - Dùng
while letđể đọc nhiều dòng đến khi gặp điều kiện dừng split(separator:)+compactMapđể đọc nhiều giá trị trên một dòng- Không dùng
readLine()trong app iOS - dùng UI components thay thế
Tiếp theo: Toán tử số học