class ClassA {
var next: ClassB? = nil
}
class ClassB {
var next: ClassA? = nil
}
let a = ClassA()
let b = ClassB()
a.next = b
b.next = aclass ClassA {
var next: ClassB? = nil
}
class ClassB {
weak var next: ClassA? = nil
}
let a = ClassA()
let b = ClassB()
a.next = b
b.next = aclass MyClass {}
weak var array = [MyClass()]class MyClass {}
class WeakBox {
weak var myClass: MyClass?
init(_ myClass: MyClass) {
self.myClass = myClass
} }
var array = [WeakBox(MyClass())]@_optimize(none)
func foo(_ number: Int) {
guard number != 0 else { return }
let newNumber = number - 2
foo(newNumber)
}
foo(3)@_optimize(none)
func foo(_ number: Int) {
guard number != 0 else { return }
let newNumber = number - 2
foo(newNumber)
}
foo(3)struct MyStruct {
var next: MyStruct?
}class MyClass {
var next: MyClass?
}enum MyEnum {
case next(MyEnum)
}struct MyStruct {
var next: MyStruct?
}class MyClass {
var next: MyClass?
}indirect enum MyEnum {
case next(MyEnum)
}struct StructA {
let a: Bool = false
let b: UInt64 = 0
}
print("Size: \(MemoryLayout<StructA>.size); Stride:
\(MemoryLayout<StructA>.stride)")
struct StructB {
let a: UInt64 = 0
let b: Bool = false
}
print("Size: \(MemoryLayout<StructB>.size); Stride:
\(MemoryLayout<StructB>.stride)")
class MyClass {
let a: UInt64 = 0
let b: Bool = false
}
print("Size: \(MemoryLayout<MyClass>.size); Stride:
\(MemoryLayout<MyClass>.stride)")struct StructA {
let a: Bool = false
let b: UInt64 = 0
}struct StructB {
let a: UInt64 = 0
let b: Bool = false
}protocol MyProtocol {
var a: UInt64 { get }
}
struct StructA: MyProtocol {
let a: UInt64 = 1
}
struct StructB: MyProtocol {
let a: UInt64 = 10
let b: UInt64 = 20
}
let a = StructA()
let b = StructB()
let array: [MyProtocol] = [a, b]
print(MemoryLayout.size(ofValue: a))
print(MemoryLayout.size(ofValue: b))
print(MemoryLayout.size(ofValue: array[0]))
print(MemoryLayout.size(ofValue: array[1]))protocol ProtocolA {}
protocol ProtocolB: AnyObject {}
class MyClass: ProtocolA, ProtocolB {}
let a: ProtocolA = MyClass()
let b: ProtocolB = MyClass()
let c: ProtocolA & ProtocolB = MyClass()
print(MemoryLayout.size(ofValue: a))
print(MemoryLayout.size(ofValue: b))
print(MemoryLayout.size(ofValue: c))protocol ProtocolA {
var b: ProtocolB? { get set }
}
protocol ProtocolB {
var a: ProtocolA? { get set }
}
struct StructA: ProtocolA {
var b: ProtocolB?
// Поля в 4 машинных слова,
// чтобы превысить размер полей под данные в экзистенциальном контейнере и структура оказалась на куче
let int1: Int = 1
let int2: Int = 2
let int3: Int = 3
let int4: Int = 4
}
struct StructB: ProtocolB {
var a: ProtocolA?
// Поля в 4 машинных слова,
// чтобы превысить размер полей под данных в экзистенциальном контейнере и структура оказалась на куче
let int1: Int = 1
let int2: Int = 2
let int3: Int = 3
let int4: Int = 4
}
var a: ProtocolA = StructA()
var b: ProtocolB = StructB()
a.b = b
b.a = aclass MyClass {
var value: Int = 0
}
var myClass = MyClass()
myClass.value = 1
let printValue = { // Если добавить `[myClass] in`, изменится ли что-то? print(myClass.value)
}
printValue()
myClass = MyClass()
myClass.value = 2
printValue()import Foundation
class MyClass {
private var callback: (() -> ())?
func foo() {
callback = {
DispatchQueue.main.async { [weak self] in
self?.updateView()
} }
}
private func updateView() {
// ...
} }
let myClass = MyClass()
myClass.foo()import Foundation
class MyClass {
private var callback: (() -> ())?
func foo() {
callback = { [weak self] in
DispatchQueue.main.async {
self?.updateView()
} }
}
private func updateView() {
// ...
} }
let myClass = MyClass()
myClass.foo()class MyClass {
var closure: (() -> ())?
init(closure: (() -> Void)? = nil) {
self.closure = closure ?? foo
}
private func foo() {
// ...
} }class MyClass {
var closure: (() -> ())?
init(closure: (() -> Void)? = nil) {
self.closure = closure ?? { [weak self] in self?.foo() }
}
private func foo() {
// ...
} }class MyView {
var subviews: [MyView] = []
deinit {
print("Deinit \(Self.self)")
} }
class MyLabelView: MyView {
func update(text: String) {
print("Update text to \(text)")
}
}
class MyViewController {
private var view: MyView?
private var updateText: ((String) -> ())?
func loadView() {
self.view = MyView()
let labelView = MyLabelView()
view?.subviews.append(labelView)
updateText = { [unowned labelView] in
labelView.update(text: $0)
} }
func update(text: String) {
guard view != nil else { return }
updateText?(text)
}
func cleanView() {
view = nil
} }
let vc = MyViewController()
vc.loadView()
vc.update(text: "Hello!")
vc.cleanView()
vc.update(text: "Bye!")class MyView {
var subviews: [MyView] = []
deinit {
print("Deinit \(Self.self)")
} }
class MyLabelView: MyView {
func update(text: String) {
print("Update text to \(text)")
} }
class MyViewController {
private var view: MyView?
private var labelView: MyLabelView?
func loadView() {
self.view = MyView()
let labelView = MyLabelView()
self.labelView = labelView
view?.subviews.append(labelView)
}
func update(text: String) {
labelView?.update(text: text)
}
func cleanView() {
view = nil
labelView = nil
}
}
let vc = MyViewController()
vc.loadView()
vc.update(text: "Hello!")
vc.cleanView()
vc.update(text: "Bye!").class ClassA {
var b = ClassB(a: self)
func foo() {
print(b)
} }
class ClassB {
let a: ClassA
init(a: ClassA) {
self.a = a }
}
let a = ClassA()
a.foo()class ClassALazy {
lazy var b = ClassBLazy(a: self)
func foo() {
print(b)
} }
class ClassBLazy {
weak var a: ClassALazy?
init(a: ClassALazy) {
self.a = a
} }
let aLazy = ClassALazy()
aLazy.foo()class ClassAOpt {
var b: ClassBOpt?
init() {
self.b = ClassBOpt(a: self)
}
func foo() {
guard let b else { return }
print(b)
} }
class ClassBOpt {
weak var a: ClassAOpt?
init(a: ClassAOpt) {
self.a = a
} }
let aOpt = ClassAOpt()
aOpt.foo()class MyClass {
static let shared = MyClass()
init() {
print("Init \(Self.self)")
}
func foo() {
// ...
} }
let myClass = MyClass()
print("Hello")
MyClass.shared.foo()Init MyClass
Hello
Init MyClassstruct MyStruct {
var a = 1
var b = 2
}
class MyClass {
static var myStruct = MyStruct()
}
func swap(_ a: inout Int, _ b: inout Int) {
let buff = a
a=b
b = buff
}
swap(&MyClass.myStruct.a, &MyClass.myStruct.b)