ตัวอย่างเชิงปฏิบัติโดยไม่ใช้เฟรมเวิร์ก UI
เขียน DSL ขนาดเล็กที่มีประโยชน์โดยไม่ใช้ UI เช่น ไฟล์การกำหนดค่า ตัวสร้างคำสั่งสอบถามอย่างง่าย ตัวสร้างข้อความ/Markdown และสายงานตรวจสอบความถูกต้องด้วย @resultBuilder
ตัวอย่างเชิงปฏิบัติโดยไม่ใช้เฟรมเวิร์ก UI เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 3 บทเรียน
ตัวสร้างผลลัพธ์ที่ไม่ใช่ส่วนติดต่อผู้ใช้
คุณสามารถสร้าง DSL ที่มีประโยชน์สำหรับงานมากมาย นอกเหนือจากส่วนติดต่อผู้ใช้ เราจะสร้างตัวสร้างconfig คำค้น ข้อความ และการตรวจสอบ ทำให้แต่ละตัวมีขนาดเล็กและมุ่งเน้นเฉพาะจุด
ตัวสร้าง config
ตัวconfigจะรวบรวมทูเพิลแบบง่าย ๆ ลงในพจนานุกรม จุดเรียกใช้จึงเป็นระเบียบและกวาดตาอ่านได้ง่าย
@resultBuilder
struct ConfigBuilder {
static func buildBlock(_ parts: (String,String)...) -> [String:String] {
var dict: [String:String] = [:]
for (k,v) in parts { dict[k] = v }
return dict
}
}
func config(@ConfigBuilder _ body: () -> [String:String]) -> [String:String] { body() }
// Use it:
let cfg = config {
("ENV", "debug")
("API_URL", "https://api.example.com")
("RETRY", "3")
}
print(cfg["API_URL"] ?? "missing")ตัวสร้างคำค้น
ตัวสร้างคำค้นจะรวม clauses ด้วย AND เรารองรับเงื่อนไขและการวนซ้ำผ่านจุดเชื่อมต่อของตัวสร้าง
struct Where { let clauses: [String] }
@resultBuilder
struct WhereBuilder {
static func buildBlock(_ parts: String...) -> Where { Where(clauses: parts) }
static func buildArray(_ parts: [String]) -> Where { Where(clauses: parts) }
static func buildEither(first: Where) -> Where { first }
static func buildEither(second: Where) -> Where { second }
}
func whereClauses(@WhereBuilder _ body: () -> Where) -> Where { body() }
func select(_ table: String, where w: Where) -> String {
let filter = w.clauses.isEmpty ? "" : " WHERE " + w.clauses.joined(separator: " AND ")
return "SELECT * FROM \(table)\(filter);"
}
// Use:
let isProd = false
let q = select("users", where: whereClauses {
"age > 18"
if isProd { "status = 'active'" } else { "status <> 'deleted'" }
})
print(q)ตัวสร้างข้อความ/มาร์กดาวน์
ตัวสร้างข้อความจะสร้างสตริงเดียว ตัวช่วยอย่าง h2 และ bullet ช่วยให้บล็อกอ่านง่าย
@resultBuilder
struct TextBuilder {
static func buildBlock(_ parts: String...) -> String { parts.joined(separator: "\n") }
static func buildEither(first: String) -> String { first }
static func buildEither(second: String) -> String { second }
static func buildArray(_ parts: [String]) -> String { parts.joined(separator: "\n") }
}
func md(@TextBuilder _ body: () -> String) -> String { body() }
func h2(_ s: String) -> String { "## " + s }
func bullet(_ s: String) -> String { "- " + s }
let doc = md {
h2("Release Notes")
bullet("Faster build")
bullet("Smaller binary")
}
print(doc)ตัวสร้างการตรวจสอบ
รวบรวมกฎ rules ของการตรวจสอบ แล้วเรียกใช้เป็นกระบวนการทำงานต่อเนื่อง บล็อกยังคงเป็นเชิงประกาศ ส่วนการทำงานจริงจะเกิดขึ้นภายหลัง
struct ValidationResult { let ok: Bool; let messages: [String] }
typealias Rule = (String) -> String? // nil = OK; otherwise error message
@resultBuilder
struct RulesBuilder {
static func buildBlock(_ parts: Rule...) -> [Rule] { parts }
static func buildArray(_ parts: [[Rule]]) -> [Rule] { parts.flatMap { $0 } }
}
func rules(@RulesBuilder _ body: () -> [Rule]) -> [Rule] { body() }
func validate(_ input: String, with rules: [Rule]) -> ValidationResult {
var msgs: [String] = []
for r in rules { if let m = r(input) { msgs.append(m) } }
return ValidationResult(ok: msgs.isEmpty, messages: msgs)
}
// Use:
let rs = rules {
{ $0.isEmpty ? "Must not be empty" : nil }
{ $0.count < 3 ? "Too short" : nil }
}
let out = validate("hi", with: rs)
print(out.ok, out.messages)เคล็ดลับการออกแบบ
เคล็ดลับ:
- เริ่มด้วย buildBlock แล้วเพิ่มแขนง/อาร์เรย์เมื่อจำเป็นเท่านั้น
- ทำให้ชนิดผลลัพธ์เรียบง่าย: สตริง อาร์เรย์ และโครงสร้างขนาดเล็ก
- จัดเตรียมฟังก์ชันทางเข้าหนึ่งฟังก์ชันต่อ DSL (เช่น config หรือ มาร์กดาวน์)
- บันทึกคำสั่งที่อนุญาตและกฎการหลีกอักขระ
กรณีใช้งานตัวสร้างที่ไม่ใช่ส่วนติดต่อผู้ใช้
ตรวจสอบสั้น ๆ: เลือกการใช้งานตัวสร้างที่ไม่ใช่ส่วนติดต่อผู้ใช้ซึ่งเหมาะสม:
ทบทวน
ทบทวน: ตัวสร้างผลลัพธ์เหมาะอย่างยิ่งสำหรับข้อมูลนำเข้าที่มีโครงสร้าง—การกำหนดค่า คำค้น ข้อความ และการตรวจสอบ ทำให้มีขนาดเล็ก อ่านง่าย และมีขอบเขตชัดเจน
คำถามที่พบบ่อย
บทเรียน “ตัวอย่างเชิงปฏิบัติโดยไม่ใช้เฟรมเวิร์ก UI” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ตัวอย่างเชิงปฏิบัติโดยไม่ใช้เฟรมเวิร์ก UI” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 3 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ตัวอย่างเชิงปฏิบัติโดยไม่ใช้เฟรมเวิร์ก UI”
เขียน DSL ขนาดเล็กที่มีประโยชน์โดยไม่ใช้ UI เช่น ไฟล์การกำหนดค่า ตัวสร้างคำสั่งสอบถามอย่างง่าย ตัวสร้างข้อความ/Markdown และสายงานตรวจสอบความถูกต้องด้วย @resultBuilder คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 3 บทเรียน
บทเรียน “ตัวอย่างเชิงปฏิบัติโดยไม่ใช้เฟรมเวิร์ก UI” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม
ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การสร้าง DSL ขนาดเล็กด้วย result builders
- API แบบกำหนดขอบเขตและรูปแบบเพื่อการอ่านง่าย
- ตัวอย่างเชิงปฏิบัติโดยไม่ใช้เฟรมเวิร์ก UI