Type Contents Order
Specifies the order of subtypes, properties, methods & more within a type.
- Identifier:
type_contents_order
- Enabled by default: No
- Supports autocorrection: No
- Kind: style
- Analyzer rule: No
- Minimum Swift compiler version: 5.0.0
- Default configuration:
Key Value severity warning order [[case], [type_alias, associated_type], [subtype], [type_property], [instance_property], [ib_inspectable], [ib_outlet], [initializer], [type_method], [view_life_cycle_method], [ib_action], [other_method], [subscript], [deinitializer]]
Non Triggering Examples
class TestViewController: UIViewController {
// Type Aliases
typealias CompletionHandler = ((TestEnum) -> Void)
// Subtypes
class TestClass {
// 10 lines
}
struct TestStruct {
// 3 lines
}
enum TestEnum {
// 5 lines
}
// Type Properties
static let cellIdentifier: String = "AmazingCell"
// Instance Properties
var shouldLayoutView1: Bool!
weak var delegate: TestViewControllerDelegate?
private var hasLayoutedView1: Bool = false
private var hasLayoutedView2: Bool = false
private var hasAnyLayoutedView: Bool {
return hasLayoutedView1 || hasLayoutedView2
}
// IBOutlets
@IBOutlet private var view1: UIView!
@IBOutlet private var view2: UIView!
// Initializers
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// Type Methods
static func makeViewController() -> TestViewController {
// some code
}
// View Life-Cycle Methods
override func viewDidLoad() {
super.viewDidLoad()
view1.setNeedsLayout()
view1.layoutIfNeeded()
hasLayoutedView1 = true
}
override func willMove(toParent parent: UIViewController?) {
super.willMove(toParent: parent)
if parent == nil {
viewModel.willMoveToParent()
}
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
view2.setNeedsLayout()
view2.layoutIfNeeded()
hasLayoutedView2 = true
}
override func viewIsAppearing(_ animated: Bool) {
super.viewIsAppearing(animated)
}
// IBActions
@IBAction func goNextButtonPressed() {
goToNextVc()
delegate?.didPressTrackedButton()
}
// Other Methods
func goToNextVc() { /* TODO */ }
func goToInfoVc() { /* TODO */ }
func goToRandomVc() {
let viewCtrl = getRandomVc()
present(viewCtrl, animated: true)
}
private func getRandomVc() -> UIViewController { return UIViewController() }
// Subscripts
subscript(_ someIndexThatIsNotEvenUsed: Int) -> String {
get {
return "This is just a test"
}
set {
log.warning("Just a test", newValue)
}
}
deinit {
log.debug("deinit")
},
}
Triggering Examples
class TestViewController: UIViewController {
// Subtypes
↓class TestClass {
// 10 lines
}
// Type Aliases
typealias CompletionHandler = ((TestEnum) -> Void)
}
class TestViewController: UIViewController {
// Stored Type Properties
↓static let cellIdentifier: String = "AmazingCell"
// Subtypes
class TestClass {
// 10 lines
}
}
class TestViewController: UIViewController {
// Stored Instance Properties
↓var shouldLayoutView1: Bool!
// Stored Type Properties
static let cellIdentifier: String = "AmazingCell"
}
class TestViewController: UIViewController {
// IBOutlets
@IBOutlet private ↓var view1: UIView!
// Computed Instance Properties
private var hasAnyLayoutedView: Bool {
return hasLayoutedView1 || hasLayoutedView2
}
}
class TestViewController: UIViewController {
// deinitializer
↓deinit {
log.debug("deinit")
}
// Initializers
override ↓init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}
// IBOutlets
@IBOutlet private var view1: UIView!
@IBOutlet private var view2: UIView!
}
class TestViewController: UIViewController {
// View Life-Cycle Methods
override ↓func viewDidLoad() {
super.viewDidLoad()
view1.setNeedsLayout()
view1.layoutIfNeeded()
hasLayoutedView1 = true
}
// Type Methods
static func makeViewController() -> TestViewController {
// some code
}
}
class TestViewController: UIViewController {
// IBActions
@IBAction ↓func goNextButtonPressed() {
goToNextVc()
delegate?.didPressTrackedButton()
}
// View Life-Cycle Methods
override func viewDidLoad() {
super.viewDidLoad()
view1.setNeedsLayout()
view1.layoutIfNeeded()
hasLayoutedView1 = true
}
}
class TestViewController: UIViewController {
// Other Methods
↓func goToNextVc() { /* TODO */ }
// IBActions
@IBAction func goNextButtonPressed() {
goToNextVc()
delegate?.didPressTrackedButton()
}
}
class TestViewController: UIViewController {
// Subscripts
↓subscript(_ someIndexThatIsNotEvenUsed: Int) -> String {
get {
return "This is just a test"
}
set {
log.warning("Just a test", newValue)
}
}
// MARK: Other Methods
func goToNextVc() { /* TODO */ }
}