Tôi đang thiết kế các API của mình để lấy các đối tượng truy vấn cụ thể dưới dạng một tham số duy nhất thay vì phát ra các chữ ký của tất cả các vị trí có thể truyền thông số.Bạn có thể tận dụng các trình khởi tạo mặc định của Swift cho các cấu trúc để đơn giản hóa việc truyền tham số không?
Ví dụ, thay vì viết này ...
func someQuery(requiredA:Bool, requiredB:Int, requiredC:String, defaultedA:Bool = false, defaultedB:Int = 1, defaultedC:String = "X", optionalA:Bool? = nil, optionalB:Int? = nil, optionalC:String? = nil){
....
}
Tôi đang viết này ...
func someQuery(queryParams:QueryParams){
....
}
Và tôi xác định (một phần - hơn dưới đây) truy vấn đối tượng như thế này ...;
struct QueryObject{
let requiredA : Bool
let requiredB : Int
let requiredC : String
let defaultedA : Bool
let defaultedB : Int
let defaultedC : String
let optionalA : Bool?
let optionalB : Int?
let optionalC : String?
}
Vì tôi chắc chắn bạn có thể biết tên, ví dụ này, một số là bắt buộc, một số có mặc định và một số là hoàn toàn tùy chọn.
Bây giờ để xác định đối tượng QueryParams, tôi đang cố gắng tạo ra nó, người dùng chỉ phải xác định các tham số cần thiết, và có thể chỉ định tùy chọn các thông số khác nếu cần/thấy phù hợp.
Đây là những gì tôi là sau khi ...
// At a minimum
let queryParams = QueryParams(requiredA:true, requiredB:1, requiredC:"x")
// Minimums overriding a default
let queryParams = QueryParams(requiredA:true, requiredB:1, requiredC:"x", defaultC:"y")
// Minimums plus an optional, still picking up all defaults
let queryParams = QueryParams(requiredA:true, requiredB:1, requiredC:"x", optionalB:8)
Để đạt được điều này, tôi đã tạo initializer của riêng tôi mà không làm gì nhưng trong nội bộ gán các thông số, như vậy ...
struct QueryParams{
init(
requiredA : Bool,
requiredB : Int,
requiredC : String,
defaultedA : Bool = true,
defaultedB : Int = 1,
defaultedC : String = "x",
optionalA : Bool? = nil,
optionalB : Int? = nil,
optionalC : String? = nil
){
self.requiredA = requiredA
self.requiredB = requiredB
self.requiredC = requiredC
self.defaultedA = defaultedA
self.defaultedB = defaultedB
self.defaultedC = defaultedC
self.optionalA = optionalA
self.optionalB = optionalB
self.optionalC = optionalC
}
let requiredA : Bool
let requiredB : Int
let requiredC : String
let defaultedA : Bool
let defaultedB : Int
let defaultedC : String
let optionalA : Bool?
let optionalB : Int?
let optionalC : String?
}
... mà có vẻ như một LOT của mã boilerplate. Tôi đang cố gắng để tìm hiểu xem có cách nào để tận dụng Swift của sáng tạo của một initializer mặc định của struct vì vậy tôi không phải viết tất cả những điều đó bằng tay.
Đáng chú ý:
- Tôi chọn cấu trúc ở đây vì Swift mang lại cho họ một initializers mặc định trong khi lớp AFAIK không có được điều đó.
- Rõ ràng, các thông số bắt buộc phải đến trước. Khác với điều đó, nó không quan trọng (mặc dù nó là tốt nếu họ có được theo thứ tự định nghĩa quá. Điểm là tôi không quan tâm.)
- Các biến thành viên có thể là
let
hoặcvar
. Tôi chỉ sử dụnglet
làm thói quen.
Vì vậy, ... mã này có thể được đơn giản hóa/giảm/loại bỏ không?
Đã chỉnh sửa. Hãy làm tương tự cho những thứ như thế này. Đó là những gì tôi làm. – MarqueIV