การขยายตัวของสวิฟท์
มันคือการขยายชั้นเรียน, struct หรือประเภทการแจงนับที่มีอยู่เพื่อเพิ่มคุณสมบัติใหม่
ส่วนขยายสามารถเพิ่มคุณสมบัติใหม่ให้กับประเภท แต่ไม่สามารถแทนที่การทำงานที่มีอยู่
การขยายตัวของสวิฟท์สามารถ:
- เพิ่มคุณสมบัติการคำนวณและคุณสมบัติคงที่คำนวณ
- วิธีการตัวอย่างของวิธีการและรูปแบบที่กำหนดไว้
- คอนสตรัคใหม่
- ความคมชัดมาตรฐาน
- ความหมายและการใช้งานในประเภทที่ซ้อนกันใหม่
- ทำให้สายที่มีอยู่กับชนิดของโปรโตคอล
ไวยากรณ์
ประกาศขยายใช้นามสกุลคำสำคัญ:
extension SomeType { // 加到SomeType的新功能写到这里 }
ส่วนขยายสามารถขยายประเภทที่มีอยู่ก็สามารถนำไปปรับใช้โปรโตคอลหนึ่งหรือมากกว่าไวยากรณ์เป็นดังนี้:
extension SomeType: SomeProtocol, AnotherProctocol { // 协议实现写到这里 }
คุณสมบัติการคำนวณ
ส่วนต่อขยายที่สามารถเพิ่มเป็นตัวอย่างที่คำนวณได้จากประเภทของคุณสมบัติทรัพย์สินและการคำนวณเพื่อประเภทที่มีอยู่
ตัวอย่าง
ตัวอย่างต่อไปนี้เพิ่มคุณสมบัติห้ากับตัวอย่างการคำนวณของชนิด int และขยายขีดความสามารถ:
extension Int { var add: Int {return self + 100 } var sub: Int { return self - 10 } var mul: Int { return self * 10 } var div: Int { return self / 5 } } let addition = 3.add print("加法运算后的值:\(addition)") let subtraction = 120.sub print("减法运算后的值:\(subtraction)") let multiplication = 39.mul print("乘法运算后的值:\(multiplication)") let division = 55.div print("除法运算后的值: \(division)") let mix = 30.add + 34.sub print("混合运算结果:\(mix)")
เอาท์พุทการทำงานของโปรแกรมข้างต้นเป็น:
加法运算后的值:103 减法运算后的值:110 乘法运算后的值:390 除法运算后的值: 11 混合运算结果:154
นวกรรมิก
ส่วนต่อขยายที่สามารถเพิ่มการก่อสร้างใหม่ประเภทที่มีอยู่
นี้จะช่วยให้คุณสามารถขยายประเภทอื่น ๆ ประเภทที่กำหนดเองของคุณเองเป็นอาร์กิวเมนต์นวกรรมิกหรือชนิดของตัวเลือกเริ่มต้นที่เพิ่มขึ้นไม่ได้รวมอยู่ในการดำเนินการเดิมที่ให้ไว้
ส่วนต่อขยายที่สามารถเพิ่มความสะดวกสบายคอนสตรัคใหม่ในระดับ init () แต่พวกเขาไม่สามารถเพิ่มคอนสตรัคที่กำหนดใหม่หรือ destructor deinit ในชั้นเรียน ()
struct sum { var num1 = 100, num2 = 200 } struct diff { var no1 = 200, no2 = 100 } struct mult { var a = sum() var b = diff() } let calc = mult() print ("mult 模块内 \(calc.a.num1, calc.a.num2)") print("mult 模块内 \(calc.b.no1, calc.b.no2)") let memcalc = mult(a: sum(num1: 300, num2: 500),b: diff(no1: 300, no2: 100)) print("mult 模块内 \(memcalc.a.num1, memcalc.a.num2)") print("mult 模块内 \(memcalc.b.no1, memcalc.b.no2)") extension mult { init(x: sum, y: diff) { _ = x.num1 + x.num2 _ = y.no1 + y.no2 } } let a = sum(num1: 100, num2: 200) print("Sum 模块内:\( a.num1, a.num2)") let b = diff(no1: 200, no2: 100) print("Diff 模块内: \(b.no1, b.no2)")
เอาท์พุทการทำงานของโปรแกรมข้างต้นเป็น:
mult 模块内 (100, 200) mult 模块内 (200, 100) mult 模块内 (300, 500) mult 模块内 (300, 100) Sum 模块内:(100, 200) Diff 模块内: (200, 100)
ทาง
ส่วนขยายสามารถเพิ่มวิธีการใหม่และวิธีการประเภทเช่นประเภทที่มีอยู่
ตัวอย่างต่อไปนี้จะเพิ่มวิธีการเช่นใหม่ชื่อหัวข้อที่จะชนิด int:
extension Int { func topics(summation: () -> ()) { for _ in 0..<self { summation() } } } 4.topics({ print("扩展模块内") }) 3.topics({ print("内型转换模块内") })
เอาท์พุทการทำงานของโปรแกรมข้างต้นเป็น:
扩展模块内 扩展模块内 扩展模块内 扩展模块内 内型转换模块内 内型转换模块内 内型转换模块内
topics
วิธีใช้ () -> ()
พารามิเตอร์ชนิดเดียวที่แสดงให้เห็นว่าการทำงานไม่มีพารามิเตอร์และค่าตอบแทนไม่
หลังจากกำหนดส่วนขยายที่คุณสามารถเรียกร้องให้จำนวนเต็ม topics
วิธีการเพื่อให้เกิดการทำงานคือการดำเนินการงานซ้ำ ๆ :
วิธีการเช่นตัวแปร
ตัวอย่างของวิธีการโดยการเพิ่มส่วนขยายยังสามารถแก้ไขอินสแตนซ์ของตัวเอง
โครงสร้างและการแจกแจงประเภทปรับเปลี่ยนตนเองหรือคุณสมบัติวิธีการจะต้องมีการทำเครื่องหมายว่าเป็นวิธีการที่ตัวอย่างของ mutating เพียงแค่ปรับเปลี่ยนการดำเนินงานเดิมของวิธีการจากที่เดียวกัน
ตัวอย่าง
ตัวอย่างต่อไปนี้จะเพิ่มการปรับเปลี่ยนวิธีการใหม่ที่เรียกว่าตารางประเภทดับเบิลสวิฟท์เพื่อให้บรรลุการคำนวณค่าเดิมตาราง:
extension Double { mutating func square() { let pi = 3.1415 self = pi * self * self } } var Trial1 = 3.3 Trial1.square() print("圆的面积为: \(Trial1)") var Trial2 = 5.8 Trial2.square() print("圆的面积为: \(Trial2)") var Trial3 = 120.3 Trial3.square() print("圆的面积为: \(Trial3)")
เอาท์พุทการทำงานของโปรแกรมข้างต้นเป็น:
圆的面积为: 34.210935 圆的面积为: 105.68006 圆的面积为: 45464.070735
ห้อย
ส่วนต่อขยายที่สามารถเพิ่มดัชนีใหม่ให้กับประเภทที่มีอยู่
ตัวอย่าง
ตัวอย่างต่อไปนี้จะ Swift เพิ่มชนิดของดัชนี Int จำนวนเต็มในตัว ดัชนี [N] จะแสดงจำนวนทศนิยม
extension Int { subscript(var multtable: Int) -> Int { var no1 = 1 while multtable > 0 { no1 *= 10 --multtable } return (self / no1) % 10 } } print(12[0]) print(7869[1]) print(786543[2])
เอาท์พุทการทำงานของโปรแกรมข้างต้นเป็น:
2 6 5
ประเภทที่ซ้อนกัน
คุณสามารถขยายชั้นเรียนที่มีอยู่โครงสร้างและ enumerations เพิ่มประเภทใหม่ที่ซ้อนกัน:
extension Int { enum calc { case add case sub case mult case div case anything } var print: calc { switch self { case 0: return .add case 1: return .sub case 2: return .mult case 3: return .div default: return .anything } } } func result(numb: [Int]) { for i in numb { switch i.print { case .add: print(" 10 ") case .sub: print(" 20 ") case .mult: print(" 30 ") case .div: print(" 40 ") default: print(" 50 ") } } } result([0, 1, 2, 3, 4, 7])
เอาท์พุทการทำงานของโปรแกรมข้างต้นเป็น:
10 20 30 40 50 50