Chcę utworzyć plik Constants w moim projekcie Swift - wypełniony statycznymi ciągami let.Plik Swift Constants - klasa lub struktura?
Czy mogę utworzyć jako strukturę lub klasę? I dlaczego?
Chcę utworzyć plik Constants w moim projekcie Swift - wypełniony statycznymi ciągami let.Plik Swift Constants - klasa lub struktura?
Czy mogę utworzyć jako strukturę lub klasę? I dlaczego?
z klasą można utworzyć podklasę i oczywiście override
class
metod. Jeśli używasz wyłącznie static
, nie ma żadnej różnicy.
Jeśli właściwości są Typy wartości, static if let someTypeProperty
będzie w porządku. Jeśli są to typy referencyjne, należy zachować szczególną ostrożność.
Tylko niektóre rzeczy o właściwościach:
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
właściwości działać zgodnie z oczekiwaniami.
// 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"
Gdy właściwość jest reference type
właściwości statycznych powróci odwołań do jednego przykładu.
// 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)
Jedyny dowód głupi sposób, że wiem jest użycie static
funkcje. Oczywiście można korzystać z funkcji class
, jeśli chcesz mieć możliwość korzystania z funkcji subclass
z class
i override
. (static
nie pozwala na nadpisanie i jest właściwie aliasem class final
)
Zapobiega to również zbyt wiele właściwości typu pozostawaniu w pamięci Nie ma sposobu, aby pozbyć się 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)
}
}
To od Ciebie zależy, co ma sens. Ponieważ obudowa struct
lub class
nigdy nie jest używana sama, nie ma znaczenia.Dla mnie struct
ma więcej sensu, ponieważ wiążę zbyt wiele zachowania z classes
.
Można również dać sobie więcej pracy i pozbyć się ()
wynikającej z korzystania z funkcji zamiast właściwości.
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)
Można użyć konstrukcjom dla danych statycznych jest to najlepszy wybór:
struct staticStrings {
static let name = "String1"
static let age = "age1"
}
I aby uzyskać dostęp do danych na całym świecie po prostu zadzwoń staticStrings.name
.
Dlaczego używamy konstrukcjom i jej lepiej niż klasy: struktury są korzystne, jeśli są one stosunkowo małe i copiable ponieważ kopiowanie jest sposób bezpieczniejszy niż o wiele odniesień do tej samej instancji, jak dzieje się z zajęć.
Aby uzyskać więcej informacji: structs and classes
Gdy klasa lub struct ma tylko statyczne właściwości/metody i nigdy nie zostanie zainicjalizowana, nie ma znaczenia, że sam typ jest typem Reference lub Value. Ma znaczenie tylko, jak ich zachowanie wpływa na zachowanie ich właściwości. –
To jest prawda @RMenke. –