Bỏ qua để đến nội dung

Nhập dữ liệu với readLine()

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:
Bumbii
Xin chào, Bumbii!
// Cách 1: Optional binding
if 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 định
let input = readLine() ?? ""
print("Input: \(input)")
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ệ!")
}
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ệ!")
}
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!)")
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 : 0
let 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 20
10 + 20 = 30
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))")
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, +))")

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 + b
case "-": result = a - b
case "*": result = a * b
case "/": result = b != 0 ? a / b : nil
default: result = nil
}
if let result {
print("Kết quả: \(a) \(op) \(b) = \(result)")
} else {
print("Phép tính không hợp lệ!")
}
  • readLine() chỉ hoạt động khi chạy Swift dạng command-line/script (Swift Package, swift run, hoặc file .swift chạ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 trim khoảng trắng thừa khi cần so khớp chuỗi chính xác: input.trimmingCharacters(in: .whitespaces).
  • readLine() trả về nil khi 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 TextField
struct 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()
}
}

  • 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