Structureในภาษา Swift

โครงสร้าง(Structure) เป็นกระบวนทัศน์ที่สำคัญในการเขียนโปรแกรมภาษา Swift ไม่ว่าจะเป็นชนิดข้อมูลต่างๆที่ใช้ในภาษา Swift มีลักษณะเป็นโครงสร้าง ซึ่งรายละเอียดของโครงสร้างไม่เพียงแค่ข้อมูล แต่ยังรวมไปถึงคำสั่งที่ทำหน้าที่ในการประมวลผลข้อมูล
ล่าสุด SwiftUI เป็นเฟรมเวิร์คสำหรับสร้าง UI สำหรับระบบปฏิบัติการต่างๆ ของแอปเปิล (macOS, iOS, iPadOS, watchOS, tvOS) ซึ่งเปิดตัวในงาน WWDC 2019 ก็มีลักษณะ structure เช่นเดียวกัน ดังนั้นเพื่อจะทำความเข้าใจใน SwiftUI ก็ควรทำความเข้าใจกับ Structure ในภาษา Swift
Introducing SwiftUI: Building Your First App - WWDC 2019 - Videos - Apple Developer
See SwiftUI in action! Watch as engineers from the SwiftUI team build a fully-functioning app from scratch. Understand…developer.apple.com
See SwiftUI in action! Watch as engineers from the SwiftUI team build a fully-functioning app from scratch. Understand…developer.apple.com
เมื่อเราได้ทำการนิยามโครงสร้าง สิ่งที่เรากำลังทำคือการประกาศชนิดข้อมูลที่อาจจะจัดเก็บตัวแปรหรือค่าคงที่ ที่เรียกว่า พร็อพเพอตี้ (properties) และรวมถึงฟังก์ชัน เรียกว่า เมธอด (method) ต่อมาเราทำการประกาศตัวแปรและค่าคงที่ของชนิดข้อมูลนี้ขึ้นมาเพื่อทำการจัดเก็บรายละเอียดของข้อมูลด้วยที่นิยามโดยโครงสร้าง ค่าต่างๆเหล่านั้น เรียกว่า อินสแตน (instances) มีลักษณะที่เป็นเอกลักษณ์ ซึ่งในแต่ละอินแตนจะมีค่าและเมธอดของตนเอง
การนิยามโครงสร้าง
การนิยามโครงสร้างใหม่ เราจะต้องใช้คีย์เวิร์ด struct ห่อหุ้มด้วยข้อมูลและฟังก์ชันการทำงานอยู่ภายในเครื่องหมายปีกกา(braces)
รายการคำสั่งที่ 6‑1 การประกาศชนิดโครงสร้าง
struct Product {
var amount : Int = 0
var name : String = “Empty”
var price : Double = 0.0
}
รายการคำสั่งที่ 6–1 นิยามโครงสร้างที่เรียกว่า Product ประกอบด้วย 3 พร็อพเพอตี้ คือ amount, name และ price การนิยามไม่ได้ทำการสร้างอะไรเกิดขึ้นมา เปรียบเสมือนกับพิมพ์เขียวที่ใช้ในการสร้างโครงสร้างจริงขึ้นมา
รายการคำสั่งที่ 6‑2 การประกาศตัวแปรที่มีชนิดข้อมูลเป็น Product
struct Product {
var amount : Int = 0
var name : String = “Empty”
var price : Double = 0.0
}
var product1 : Product = Product()
รายการคำสั่งที่ 6–2 ทำการสร้างตัวแปรที่มีชนิดข้อมูลเป็น Product ที่ทำการจัดเก็บค่าอินสแตนของ โครงสร้าง Product ที่มีพร็อพเพอตี้ amount, name และ price อินสแตนที่ถูกสร้างโดย Product() ที่เป็น Initializer และทำการกำหนดไปยังตัวแปร product1
พร็อพเพอตี้ของอินสแตนใหม่ที่สร้างขึ้นมาจะมีค่าที่ถูกประกาศอยู่ในการนิยามในโครงสร้าง ในที่นี้คือ 0 , “Empty” และ 0.0 ซึ่งเราสามารถทำการเปลี่ยนแปลงค่าได้เหมือนกับการเปลี่ยนแปลงค่าของตัวแปรอื่นๆ ในการเข้าถึงพร็อพเพอตี้ในโครงสร้าง มีรูปแบบของไวยากรณ์คือ variable.property ซึ่ง variable คือ ชื่อของตัวแปรที่จัดเก็บค่าอินสแตนของโครงสร้างและพร็อพเพอตี้คื้อขื่อของพร็อพเพอตร้ที่เราต้องการเข้าถึง
รายการคำสั่งที่ 6‑3 การกำหนดค่าใหม่ให้กับพร็อพเพอตี้ของโครงสร้าง
struct Product {
var amount : Int = 0
var name : String = “Empty”
var price : Double = 0.0
}
var product1 : Product = Product()
product1.amount = 5
product1.name = “iPhone7”
product1.price = 21900.00
var totalValue = Double(product1.amount) * product1.price
print(“Total value of \(product1.name) is \(totalValue) baht”)
// “Total value of iPhone7 is 109500.0 baht”
โครงสร้างอาจจะเป็นอินสแตนภายในโครงสร้างอื่น ตราบเท่าที่จำเป็นแบบไม่จำกัด โดยการใช้ dot notation ในการขยายเพื่อเข้าถึงในทุกๆอีลีเมนต์ในโครงสร้าง
รายการคำสั่งที่ 6‑4 การสร้างโครงสร้างภายในโครงสร้าง
struct Price {
var TH = 0.0
var USD = 0.0
}
struct Product {
var amount : Int = 0
var name : String = “Empty”
var price = Price()
}
var product1 = Product()
product1.amount = 5
product1.name = “iPhone7”
product1.price.TH = 21900.00
product1.price.USD = 644
จากรายการด้านบนเป็นการสร้างโครงสร้าง Price เป็นส่วนหนึ่งของโครงสร้าง Product
เมธอดของ Structures
โครงสร้างเป็นชนิดข้อมูลที่มีความซับซ้อน เช่นเดียวกับ tuple เราสามารถกำหนดชุดคำสั่งเป็นส่วนหนึ่งภายในโครงสร้างได้ สิ่งที่กำหนดลงไปเรียกกว่าฟังก์ชัน ซึ่งฟังก์ชันที่อยู่ในโครงสร้างเรียกกว่า เมธอด(method)
รายการคำสั่งที่ 6‑5 การนิยามเมธอด
struct Product {
var amount : Int = 0
var name : String = “Empty”
var price : Double = 0.0
func total() -> Double {
let totalValue = Double(amount) * price
return totalValue
}
}
var product1 : Product = Product()
product1.amount = 5
product1.name = “iPhone7”
product1.price = 21900.00
print(“Total Value : \(product1.total())”) // “Total Value : 109500.0“
การทำการเปลี่ยนแปลงค่าพร็อพเพอตี้ในโครงสร้าง สามารถทำได้โดยใช้คีย์เวิร์ด mutating หน้าฟังก์ชันหรือเมธอดที่ทำการเปลี่ยนแปลงค่าของพร็อพเพอตี้
รายการคำสั่งที่ 6‑6 การกำหนดค่าใหม่ให้กับพร็อพเพอตี้จากภายในโครงสร้าง
struct Product {
var amount : Int = 0
var name : String = “Empty”
var price : Double = 0.0
mutating func total() {
let totalValue = Double(amount) * price
name += “ \(totalValue) Baht”
}
}
var product1 : Product = Product()
product1.amount = 5
product1.name = “iPhone7”
product1.price = 21900.00
product1.total()
print(“Total Value : \(product1.name)”)
// “Total Value : iPhone7 109500.0 Baht“
การกำหนดค่าเริ่มต้นของ Structures
ในทุกๆอินสแตนที่เราทำการสร้างจากการนิยามโครงสร้างมีวัตถุประสงค์ในการจัดเก็บและประมวลผลข้อมูล ตัวอย่างเช่น เราทำการสร้างหลายๆ อินสแตนของโครงสร้างของสินค้า ทำการจัดเก็บข้อมูลของสินค้าต่างๆ แต่ละสินค้าจะมีชื่อและราคาสินค้าที่แตกต่างกัน ดังนั้นพร็อพเพอตี้ของแต่ละอินสแตนจำเป็นต้องมีการกำหนดค่าเริ่มต้นด้วยค่าที่เหมาะสม การกำหนดค่าเริ่มต้นให้กับอินสแตนเป็นการทำงานโดยทั่วไป และจะมีความยุ่งยากหากจะต้องกำหนดค่าแต่ละค่าให้กับอินสแตนที่ได้สร้างขึ้นมา ภาษา Swift จึงได้นำเสนอทางเลือกที่แตกต่างในการกำหนดค่าเริ่มต้น วิธีที่สะดวกที่ทำโดยส่วนใหญ่ เรียกกว่า memberwise initializer
รายการคำสั่งที่ 6‑7 การกำหนดค่าเริ่มต้นให้กับพร็อพเพอตี้
struct Product {
var amount : Int = 0
var name : String = “Empty”
var price : Double = 0.0
}
var product1 = Product(amount : 5, name : “iPhone7”, price : 21900.00)
var total = Double(product1.amount) * product1.price
print(“Total Value : \(total)”) “Total Value : 109500.0“
จากรายการคำสั่งที่ 6–7 เป็นการกำหนดค่าให้กับพร็อพเพอตี้ด้วยค่าเริ่มต้น และถูกแทนที่ด้วยค่าเริ่มต้นในตอนสร้างตัวแปรแบบโครงสร้าง
รายการคำสั่งที่ 6‑8 การกำหนดค่าเริ่มต้นให้กับโครงสร้างด้วย memberwise initializer
struct Product {
var amount : Int
var name : String
var price : Double
}
var product1 = Product(amount : 5, name : “iPhone7”, price : 21900.00)
var total = Double(product1.amount) * product1.price
print(“Total Value : \(product1.name) \(total)”) “Total Value : iPhone 7 109500.0“
จากคำสั่งด้านบนเราไม่จำเป็นต้องกำหนดค่าเริ่มต้นให้กับตัวแปรในโครงสร้าง แต่กำหนดค่าเริ่มต้นจากการสร้างตัวแปรโครงสร้าง
อีกรูปแบบหนึ่งของการกำหนดค่าเริ่มต้นให้กับโครงสร้าง ที่มีหลายๆพร็อพเพอตี้คือการใข้เมธอดที่เรียกว่า init() ซึ่งเมธอด init() จะถูกเรียกใช้ในทันทีที่อินสแตนถูกสร้างขึ้นมา
รายการคำสั่งที่ 6‑9 การกำหนดค่าเริ่มต้นจากเมธอด init()
struct Price {
var USD : Double
var TH : Double
init() {
USD = 5.99
TH = USD * 34.55
}
}
var productPrice = Price()
print(productPrice.USD) // 5.9900000000000002
print(productPrice.TH) // 206.9545
รายการคำสั่งที่ 6‑10 การประกาศ init() ด้วยพารามิเตอร์
struct Price {
var USD : Double
var TH : Double
init(usa:Double) {
USD = usa
TH = USD * 34.55
}
}
var productPrice = Price(usa: 5)
print(productPrice.USD) // 5.0
print(productPrice.TH) // 172.75
รายการคำสั่งที่ 6‑11 การกำหนดค่าเริ่มต้นจากเมธอด init() ที่มีมากกว่า 1 ด้วยพารามิเตอร์
struct Price {
var USD : Double
var TH : Double
init(usa:Double) {
USD = usa
TH = USD * 32.84
}
init(thai:Double) {
TH = thai
USD = thai * 0.030451
}
}
var productPrice = Price(thai: 5000)
print(productPrice.USD) // 152.255
print(productPrice.TH) // 5000.0
ไม่มีความคิดเห็น:
แสดงความคิดเห็น