Tôi muốn tạo một tệp Constants trong dự án Swift của tôi - chứa đầy các chuỗi cho phép.Tệp Constants Swift - lớp hoặc cấu trúc?
Tôi có nên tạo thành cấu trúc hoặc lớp học không? Và tại sao?
Tôi muốn tạo một tệp Constants trong dự án Swift của tôi - chứa đầy các chuỗi cho phép.Tệp Constants Swift - lớp hoặc cấu trúc?
Tôi có nên tạo thành cấu trúc hoặc lớp học không? Và tại sao?
Với một lớp học mà bạn có thể tạo một lớp con và rõ ràng override
class
phương pháp. Nếu bạn hoàn toàn sử dụng static
thì hoàn toàn không có sự khác biệt.
Nếu thuộc tính là Loại giá trị, static if let someTypeProperty
sẽ ổn. Nếu họ là loại tham khảo, cần có thêm một số dịch vụ chăm sóc.
Chỉ cần một số công cụ bằng tài sản:
struct PresetStringsStruct {
static let someString : String = "Some Text" // struct
static let someView : UIView = UIView(frame: CGRectZero)
private init() {
print("init") // never happens
}
}
class PresetStringsClass {
static let someString : String = "Some Text" // struct
static let someView : UIView = UIView(frame: CGRectZero)
private init() {
print("init") // never happens
}
}
struct
tính làm việc như mong đợi.
// value properties
var txtStruct = PresetStringsStruct.someString // "Some Text"
txtStruct = "SomeOtherText" // "SomeOtherText"
var txtStruct2 = PresetStringsStruct.someString // "Some Text"
var txtClass = PresetStringsClass.someString // "Some Text"
txtClass = "SomeOtherText" // "SomeOtherText"
var txtClass2 = PresetStringsClass.someString // "Some Text"
Khi khách sạn sẽ là reference type
các thuộc tính tĩnh sẽ trở lại tham chiếu tới một ví dụ.
// reference properties
var viewStruct = PresetStringsStruct.someView
viewStruct.frame = CGRect(x: 0, y: 0, width: 50, height: 50)
var viewStruct2 = PresetStringsStruct.someView // CGRect(x: 0, y: 0, width: 50, height: 50)
var viewClass = PresetStringsClass.someView
viewClass.frame = CGRect(x: 0, y: 0, width: 50, height: 50)
var viewClass2 = PresetStringsClass.someView // CGRect(x: 0, y: 0, width: 50, height: 50)
Kẻ ngu dại chỉ chứng minh phương pháp mà tôi biết là sử dụng static
chức năng. Bạn rõ ràng có thể sử dụng các chức năng class
nếu bạn muốn có thể subclass
các chức năng class
và override
. (static
không cho phép ghi đè và thực sự là một bí danh cho class final
)
này cũng ngăn cản quá nhiều Loại Properties từ còn lại trong ký ức Không có cách nào để thoát khỏi một static let someProperty : Int = 0
struct PresetStringsStruct {
static func someStringFunc() -> String {
return "SomeText"
}
static func someViewFunc() -> UIView {
return UIView(frame: CGRectZero)
}
}
class PresetStringsClass {
static func someStringFunc() -> String {
return "SomeText"
}
static func someViewFunc() -> UIView {
return UIView(frame: CGRectZero)
}
}
Sau đó, tùy bạn quyết định điều gì có ý nghĩa hơn. Kể từ khi kèm theo struct
hoặc class
không bao giờ được sử dụng chính nó, nó làm cho không có sự khác biệt.Đối với tôi, struct
có ý nghĩa hơn vì tôi liên kết quá nhiều hành vi với classes
.
Bạn cũng có thể tự mình làm việc nhiều hơn và loại bỏ các hàm ()
do sử dụng hàm thay vì thuộc tính.
struct PresetStringsStruct {
static var someString : String {
get {
return someStringFunc()
}
}
static var someView : UIView {
get {
return someViewFunc()
}
}
static func someStringFunc() -> String {
return "SomeText"
}
static func someViewFunc() -> UIView {
return UIView(frame: CGRectZero)
}
}
var viewStruct = PresetStringsStruct.someView
viewStruct.frame = CGRect(x: 0, y: 0, width: 50, height: 50)
var viewStruct2 = PresetStringsStruct.someView // CGRect(x: 0, y: 0, width: 0, height: 0)
Bạn có thể sử dụng cấu trúc dữ liệu tĩnh là sự lựa chọn tốt nhất:
struct staticStrings {
static let name = "String1"
static let age = "age1"
}
Và để truy cập dữ liệu trên toàn cầu chỉ cần gọi staticStrings.name
.
Tại sao chúng ta sử dụng cấu trúc và tốt hơn của nó so với lớp: Struct là thích hợp hơn nếu họ là tương đối nhỏ và copiable vì sao chép là cách an toàn hơn so với việc có nhiều tài liệu tham khảo cho các ví dụ tương tự như xảy ra với các lớp học.
Để biết thêm chi tiết: structs and classes
Khi lớp hoặc cấu trúc chỉ có thuộc tính/phương pháp tĩnh và sẽ không bao giờ được khởi chạy, không quan trọng là loại đó là tham chiếu hoặc loại giá trị. Nó chỉ quan trọng như thế nào hành vi của họ ảnh hưởng đến hành vi của tài sản của họ. –
Vâng thats true @RMenke. –