Swift - Generics
Ngôn ngữ Swift 4 cung cấp các tính năng 'Chung' để viết các hàm và kiểu linh hoạt và có thể tái sử dụng. Generics được sử dụng để tránh trùng lặp và cung cấp tính trừu tượng. Các thư viện chuẩn của Swift 4 được xây dựng bằng mã generics. Loại 'Mảng' và 'Từ điển' của Swift 4s thuộc về các bộ sưu tập chung. Với sự trợ giúp của mảng và từ điển, các mảng được định nghĩa để chứa các giá trị 'Int' và giá trị 'Chuỗi' hoặc bất kỳ kiểu nào khác.
func exchange(a: inout Int, b: inout Int) {
let temp = a
a = b
b = temp
}
var numb1 = 100
var numb2 = 200
print("Before Swapping values are: \(numb1) and \(numb2)")
exchange(a: &numb1, b: &numb2)
print("After Swapping values are: \(numb1) and \(numb2)")
Khi chúng tôi chạy chương trình trên bằng sân chơi, chúng tôi nhận được kết quả sau:
Before Swapping values are: 100 and 200
After Swapping values are: 200 and 100
Chức năng chung: Tham số kiểu
Các hàm chung có thể được sử dụng để truy cập vào bất kỳ kiểu dữ liệu nào như 'Int' hoặc 'Chuỗi'.
func exchange<T>(a: inout T, b: inout T) {
let temp = a
a = b
b = temp
}
var numb1 = 100
var numb2 = 200
print("Before Swapping Int values are: \(numb1) and \(numb2)")
exchange(a: &numb1, b: &numb2)
print("After Swapping Int values are: \(numb1) and \(numb2)")
var str1 = "Generics"
var str2 = "Functions"
print("Before Swapping String values are: \(str1) and \(str2)")
exchange(a: &str1, b: &str2)
print("After Swapping String values are: \(str1) and \(str2)")
Khi chúng tôi chạy chương trình trên bằng sân chơi, chúng tôi nhận được kết quả sau:
Before Swapping Int values are: 100 and 200
After Swapping Int values are: 200 and 100
Before Swapping String values are: Generics and Functions
After Swapping String values are: Functions and Generics
Hàm Exchange () được sử dụng để hoán đổi các giá trị được mô tả trong chương trình trên và <T> được sử dụng như một tham số kiểu. Lần đầu tiên, hàm Exchange () được gọi để trả về giá trị 'Int' và lần gọi thứ hai tới hàm Exchange () sẽ trả về giá trị 'Chuỗi'. Nhiều loại tham số có thể được đưa vào bên trong dấu ngoặc nhọn được phân tách bằng dấu phẩy.
Tham số kiểu được đặt tên do người dùng định nghĩa để biết mục đích của tham số kiểu mà nó nắm giữ. Swift 4 cung cấp <T> dưới dạng tên tham số kiểu chung. Tuy nhiên, các tham số kiểu như Mảng và Từ điển cũng có thể được đặt tên là khóa, giá trị để xác định rằng chúng thuộc kiểu 'Từ điển'.
struct TOS<T> {
var items = [T]()
mutating func push(item: T) {
items.append(item)
}
mutating func pop() -> T {
return items.removeLast()
}
}
var tos = TOS<String>()
tos.push(item: "Swift 4")
print(tos.items)
tos.push(item: "Generics")
print(tos.items)
tos.push(item: "Type Parameters")
print(tos.items)
tos.push(item: "Naming Type Parameters")
print(tos.items)
let deletetos = tos.pop()
Khi chúng tôi chạy chương trình trên bằng sân chơi, chúng tôi nhận được kết quả sau:
[Swift 4]
[Swift 4, Generics]
[Swift 4, Generics, Type Parameters]
[Swift 4, Generics, Type Parameters, Naming Type Parameters]
Mở rộng một loại chung
Mở rộng thuộc tính ngăn xếp để biết đầu mục có từ khóa 'mở rộng'.
struct TOS<T> {
var items = [T]()
mutating func push(item: T) {
items.append(item)
}
mutating func pop() -> T {
return items.removeLast()
}
}
var tos = TOS<String>()
tos.push(item: "Swift 4")
print(tos.items)
tos.push(item: "Generics")
print(tos.items)
tos.push(item: "Type Parameters")
print(tos.items)
tos.push(item: "Naming Type Parameters")
print(tos.items)
extension TOS {
var first: T? {
return items.isEmpty ? nil : items[items.count - 1]
}
}
if let first = tos.first {
print("The top item on the stack is \(first).")
}
Khi chúng tôi chạy chương trình trên bằng sân chơi, chúng tôi nhận được kết quả sau:
["Swift 4"]
["Swift 4", "Generics"]
["Swift 4", "Generics", "Type Parameters"]
["Swift 4", "Generics", "Type Parameters", "Naming Type Parameters"]
The top item on the stack is Naming Type Parameters.
Loại Ràng buộc
Ngôn ngữ Swift 4 cho phép 'các ràng buộc kiểu' để chỉ định xem tham số kiểu kế thừa từ một lớp cụ thể hay để đảm bảo tiêu chuẩn tuân thủ giao thức.
func exchange<T>(a: inout T, b: inout T) {
let temp = a
a = b
b = temp
}
var numb1 = 100
var numb2 = 200
print("Before Swapping Int values are: \(numb1) and \(numb2)")
exchange(a: &numb1, b: &numb2)
print("After Swapping Int values are: \(numb1) and \(numb2)")
var str1 = "Generics"
var str2 = "Functions"
print("Before Swapping String values are: \(str1) and \(str2)")
exchange(a: &str1, b: &str2)
print("After Swapping String values are: \(str1) and \(str2)")
Khi chúng tôi chạy chương trình trên bằng sân chơi, chúng tôi nhận được kết quả sau:
Before Swapping Int values are: 100 and 200
After Swapping Int values are: 200 and 100
Before Swapping String values are: Generics and Functions
After Swapping String values are: Functions and Generics
Các loại liên kết
Swift 4 cho phép các kiểu liên kết được khai báo bên trong định nghĩa giao thức bằng từ khóa 'kiểu liên kết'.
protocol Container {
associatedtype ItemType
mutating func append(item: ItemType)
var count: Int { get }
subscript(i: Int) -> ItemType { get }
}
struct TOS<T>: Container {
// original Stack<T> implementation
var items = [T]()
mutating func push(item: T) {
items.append(item)
}
mutating func pop() -> T {
return items.removeLast()
}
// conformance to the Container protocol
mutating func append(item: T) {
self.push(item: item)
}
var count: Int {
return items.count
}
subscript(i: Int) -> T {
return items[i]
}
}
var tos = TOS<String>()
tos.push(item: "Swift 4")
print(tos.items)
tos.push(item: "Generics")
print(tos.items)
tos.push(item: "Type Parameters")
print(tos.items)
tos.push(item: "Naming Type Parameters")
print(tos.items)
Khi chúng tôi chạy chương trình trên bằng sân chơi, chúng tôi nhận được kết quả sau:
[Swift 4]
[Swift 4, Generics]
[Swift 4, Generics, Type Parameters]
[Swift 4, Generics, Type Parameters, Naming Type Parameters]
Điều khoản ở đâu
Các ràng buộc kiểu cho phép người dùng xác định các yêu cầu đối với các tham số kiểu được liên kết với một chức năng hoặc kiểu chung. Để xác định các yêu cầu cho các kiểu liên kết, mệnh đề 'where' được khai báo như một phần của danh sách tham số kiểu. Từ khóa 'where' được đặt ngay sau danh sách các tham số kiểu, theo sau là các ràng buộc của các kiểu liên kết, mối quan hệ bình đẳng giữa các kiểu và các kiểu liên kết.
protocol Container {
associatedtype ItemType
mutating func append(item: ItemType)
var count: Int { get }
subscript(i: Int) -> ItemType { get }
}
struct Stack<T>: Container {
// original Stack<T> implementation
var items = [T]()
mutating func push(item: T) {
items.append(item)
}
mutating func pop() -> T {
return items.removeLast()
}
// conformance to the Container protocol
mutating func append(item: T) {
self.push(item: item)
}
var count: Int {
return items.count
}
subscript(i: Int) -> T {
return items[i]
}
}
func allItemsMatch<
C1: Container, C2: Container
where C1.ItemType == C2.ItemType, C1.ItemType: Equatable>
(someContainer: C1, anotherContainer: C2) -> Bool {
// check that both containers contain the same number of items
if someContainer.count != anotherContainer.count {
return false
}
// check each pair of items to see if they are equivalent
for i in 0..<someContainer.count {
if someContainer[i] != anotherContainer[i] {
return false
}
}
// all items match, so return true
return true
}
var tos = Stack<String>()
tos.push(item: "Swift 4")
print(tos.items)
tos.push(item: "Generics")
print(tos.items)
tos.push(item: "Where Clause")
print(tos.items)
var eos = ["Swift 4", "Generics", "Where Clause"]
print(eos)
Khi chúng tôi chạy chương trình trên bằng sân chơi, chúng tôi nhận được kết quả sau:
[Swift 4]
[Swift 4, Generics]
[Swift 4, Generics, Where Clause]
[Swift 4, Generics, Where Clause]