Jak mogę utworzyć podklasę struktury w języku Swift?


struct MyRect : CGRect {...}

Czy w ogóle możliwe jest szybkie utworzenie podklasy struktury?
Znalazłem już przykład na oficjalnej stronie Apple:
Ten przykład rozszerza strukturę CGRect, aby zawierała obliczoną właściwość zakresu:
extension CGRect {
var area: CGFloat {
return width * height
}
}
let rect = CGRect(x: 0.0, y: 0.0, width: 10.0, height: 50.0)
let area = rect.area

Jak mogę zdefiniować podklasę struktury?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Nie jest możliwe, aby podklasa
struct
w języku Swift była tylko podklasą.
extension
nie jest podklasą, a jedynie dodaje dodatkową funkcjonalność do istniejącej
struct
, jest to porównywalne z kategorią w Objective-C. [/code]Proszę zobaczyć

przez dokumentację Apple Swift tutaj
https://developer.apple.com/li ... -ID82
aby przeczytać o różnicach między
struct
a
class
.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jest trochę stary, ale natknąłem się na niego i pomyślałem, że opublikuję ogólny szablon, którego używam w razie potrzeby. Na przykład aplikacja, nad którą pracowałem, wymagała pracy z AspectRatios. Cóż, moim zdaniem AspectRatio to nic innego jak CGSize z dodatkowymi funkcjami. Chciałem trochę oddzielić AspectRatio od CGSize, więc utworzyłem TypeAlias, a następnie utworzyłem rozszerzenie TypeAlias.
Coś w tym stylu:
public typealias AspectRatio = CGSizepublic extension AspectRatio {
enum Orientation {
case landscape
case portrait
case square
}
static let square = AspectRatio(width: 1.0, height: 1.0)
static let standard = AspectRatio(width: 4.0, height: 3.0)
static let wideScreen = AspectRatio(width: 16.0, height: 9.0)
static let theater = AspectRatio(width: 21.0, height: 9.0)
static let imax = AspectRatio(width: 1.9, height: 1.0)func aspectRatio(precision: Int? = nil) -> CGFloat {
let aspectRatio = width/height guard let precision = precision else {
return aspectRatio
} let multiplier = pow(10, Double(precision)) let value = (Double(aspectRatio) * multiplier).rounded()/multiplier
return CGFloat(value)
}var orientation: Orientation {
switch self.aspectRatio() {
case let aspect where aspect > 1.0:
return .landscape
case let aspect where aspect < 1.0:
return .portrait
default:
return .square
}
}func flipped() -> AspectRatio {
return AspectRatio(width: height, height: width)
} ...
}

Wtedy mógłbym łatwo zdefiniować takie zmienne:
var aspectRatio: AspectRatio = .imax
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Od wersji Swift 5.1 można teraz zrobić coś podobnego do tego, o co prosiłeś: używając kompozycji, z
KeyPath
i
dynamicMemberLookup
. Spójrz:

https://medium.com/%40acecilia ... 12%3F source=friends_link&sk=da479578032c0b46c1c69111dfb6054e
https://medium.com/%40acecilia ... 6054e

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się