All Versions
Latest Version
Avg Release Cycle
29 days
Latest Release

Changelog History
Page 1

  • v0.50.1 Changes

    ๐Ÿ’ฅ Breaking

    • None.


    • None.

    โœจ Enhancements

    • ๐Ÿšš Moved the validation of doc comments in local scopes out of orphaned_doc_comment and into a new opt-in local_doc_comment rule.
      JP Simard #4573

    • ๐Ÿ‘• SwiftLint's Swift Package Build Tool Plugin will now only scan files in the target being built.
      Tony Arnold #4406

    ๐Ÿ› Bug Fixes

    • ๐Ÿ›  Fix building with swift build -c release.
      JP Simard #4559 #4560

    • Fix false positives in lower_acl_than_parent when the nominal parent is an extension.
      Steffen Matthischke #4564

    • Fix minimum_fraction_length handling in number_separator.
      JP Simard #4576

    • ๐Ÿ›  Fix false positives in closure_spacing.
      JP Simard #4565 #4582

    • ๐Ÿ›  Fix line count calculation for multiline string literals.
      JP Simard #4585

    • Fix false positives in unused_closure_parameter when using identifiers with backticks.
      JP Simard #4588

    • ๐Ÿ›  Fix type_name regression where names with backticks would trigger violations.
      JP Simard #4571

  • v0.50.0 Changes

    ๐Ÿ’ฅ Breaking

    • ๐Ÿ‘• SwiftLint now requires Swift 5.7 or higher to build.
      JP Simard

    • Exclude weak_delegate rule from autocorrection due to behavioral changes leading to potential undefined behavior or bugs.
      SimplyDanny #3577

    • ๐Ÿšš The anyobject_protocol rule is now deprecated and will be completely removed in a future release because it is now handled by the Swift compiler.
      JP Simard

    • ๐Ÿ‘• Built-in SwiftLint rules are no longer marked as public in SwiftLintFramework. This only impacts the programmatic API for the SwiftLintFramework module.
      JP Simard


    • None.

    โœจ Enhancements

    • ๐Ÿš€ SwiftSyntax libraries have been updated from the previous 5.6 release and now use the new parser written in Swift. Swift 5.7+ features should now be parsed more accurately. We've also measured an improvement in lint times of up to 15%. This should also fix some deployment issues where the exact version of the internal SwiftSyntax parser needed to be available. If you notice any unexpected changes to lint results, please file an issue on the SwiftLint issue tracker. We can look into it and if it's a SwiftSyntax parser regression we can re-file it upstream.
      JP Simard #4031

    • Rewrite some rules with SwiftSyntax, fixing some false positives and catching more violations:

      • anonymous_argument_in_multiline_closure
      • array_init
      • attributes
      • balanced_xctest_lifecycle
      • block_based_kvo
      • class_delegate_protocol
      • closing_brace
      • closure_body_length
      • closure_parameter_position
      • collection_alignment
      • comment_spacing
      • computed_accessors_order
      • conditional_returns_on_newline
      • contains_over_filter_count
      • contains_over_filter_is_empty
      • contains_over_first_not_nil
      • contains_over_range_nil_comparison
      • convenience_type
      • deployment_target
      • discarded_notification_center_observer
      • discouraged_assert
      • discouraged_direct_init
      • discouraged_none_name
      • discouraged_object_literal
      • discouraged_optional_boolean
      • duplicate_enum_cases
      • duplicated_key_in_dictionary_literal
      • dynamic_inline
      • empty_collection_literal
      • empty_count
      • empty_enum_arguments
      • empty_parameters
      • empty_parentheses_with_trailing_closure
      • empty_string
      • enum_case_associated_values_count
      • explicit_enum_raw_value
      • explicit_init
      • explicit_top_level_acl
      • fallthrough
      • file_name
      • first_where
      • flatmap_over_map_reduce
      • for_where
      • force_try
      • force_unwrapping
      • function_body_length
      • function_default_parameter_at_end
      • function_parameter_count
      • generic_type_name
      • ibinspectable_in_extension
      • identical_operands
      • implicit_getter
      • implicitly_unwrapped_optional
      • inclusive_language
      • inert_defer
      • is_disjoint
      • joined_default_parameter
      • large_tuple
      • last_where
      • legacy_cggeometry_functions
      • legacy_constant
      • legacy_constructor
      • legacy_hashing
      • legacy_multiple
      • legacy_nsgeometry_functions
      • legacy_objc_type
      • legacy_random
      • lower_acl_than_parent
      • multiline_arguments_brackets
      • multiline_parameters
      • multiple_closures_with_trailing_closure
      • no_extension_access_modifier
      • no_fallthrough_only
      • no_space_in_method_call
      • notification_center_detachment
      • nslocalizedstring_key
      • nslocalizedstring_require_bundle
      • nsobject_prefer_isequal
      • number_separator
      • object_literal
      • operator_whitespace
      • optional_enum_case_matching
      • orphaned_doc_comment
      • overridden_super_call
      • override_in_extension
      • pattern_matching_keywords
      • prefer_nimble
      • prefer_self_in_static_references
      • prefer_self_type_over_type_of_self
      • prefer_zero_over_explicit_init
      • prefixed_toplevel_constant
      • private_action
      • private_outlet
      • private_over_fileprivate
      • private_subject
      • private_unit_test
      • prohibited_interface_builder
      • prohibited_super_call
      • protocol_property_accessors_order
      • quick_discouraged_focused_test
      • quick_discouraged_pending_test
      • raw_value_for_camel_cased_codable_enum
      • reduce_boolean
      • reduce_into
      • redundant_discardable_let
      • redundant_nil_coalescing
      • redundant_objc_attribute
      • redundant_optional_initialization
      • redundant_set_access_control
      • redundant_string_enum_value
      • required_deinit
      • required_enum_case
      • return_arrow_whitespace
      • self_in_property_initialization
      • shorthand_operator
      • single_test_class
      • sorted_first_last
      • static_operator
      • strict_fileprivate
      • strong_iboutlet
      • switch_case_alignment
      • switch_case_on_newline
      • test_case_accessibility
      • toggle_bool
      • trailing_comma
      • trailing_semicolon
      • type_body_length
      • type_name
      • unneeded_break_in_switch
      • unneeded_parentheses_in_closure_argument
      • unowned_variable_capture
      • untyped_error_in_catch
      • unused_capture_list
      • unused_closure_parameter
      • unused_control_flow_label
      • unused_enumerated
      • unused_optional_binding
      • unused_setter_value
      • valid_ibinspectable
      • vertical_parameter_alignment
      • weak_delegate
      • xct_specific_matcher
      • xctfail_message
        Marcelo Fabri SimplyDanny JP Simard #2915
    • The "body length" family of rules have changed how they calculate body line count to be significantly more correct and intuitive. However, this is likely to require adjustments to your configuration or disable commands to account for the changes.
      JP Simard

    • โž• Add ability to filter rules for generate-docs subcommand.

    • Add new excludes_trivial_init configuration for missing_docs rule to exclude initializers without any parameters.
      Marcelo Fabri #4107

    • Add new ns_number_init_as_function_reference rule to catch NSNumber.init and NSDecimalNumber.init being used as function references since it can cause the wrong initializer to be used, causing crashes. See for more info.
      Marcelo Fabri

    • Add accessibility_trait_for_button rule to warn if a SwiftUI View has a tap gesture added to it without having the button or link accessibility trait.
      Ryan Cole

    • โž• Add methods from SE-0348 to UnusedDeclarationRule.
      JP Simard

    • Include the configured bind_identifier in self_binding violation messages.
      JP Simard

    • The self_binding rule now catches shorthand optional bindings (for example if let self {}) when using a bind_identifier different than self.
      Marcelo Fabri

    • Add library_content_provider file type to file_types_order rule to allow LibraryContentProvider to be ordered independent from main_type.

    • Add test_parent_classes option to test_case_accessibility rule, which allows detection in subclasses of XCTestCase.
      Martin Redington #4200

    • Add a new shorthand_optional_binding opt-in rule that triggers in Swift 5.7 when a shadowing optional binding is created in an if or guard statement.
      SimplyDanny #4202

    • ๐Ÿ“œ Use SwiftSyntax instead of SourceKit to determine if a file has parser errors before applying corrections. This speeds up corrections significantly when none of the rules use SourceKit.
      JP Simard

    • โž• Add Swift Package Build Tool Plugin with support for Swift Packages and Xcode projects.
      Johannes Ebeling #3679 #3840

    • Make private_unit_test rule correctable.

    • Disregard whitespace differences in identical_operands rule. That is, the rule now also triggers if the left-hand side and the right-hand side of an operation only differ in trivia.

    • ๐Ÿ–จ Print violations in realtime if --progress and --output are both set.
      JP Simard

    • Trigger prefer_self_in_static_references rule on more type references like:

      • Key paths (e.g. \MyType.myVar -> \Self.myVar)
      • Computed properties (e.g. var i: Int { MyType.myVar ) -> var i: Int { Self.myVar })
      • Constructor calls (e.g. MyType() -> Self())


    • โšก๏ธ Update for_where rule, adding a new configuration allow_for_as_filter to allow using for in with a single if inside when there's a return statement inside the if's body.
      Marcelo Fabri #4040

    • quick_discouraged_call, quick_discouraged_focused_test and quick_discouraged_pending_test rules now trigger on subclasses of QuickSpec. Marcelo Fabri #4420

    • 0๏ธโƒฃ The type_name rule now validates protocol declarations by default. You can opt-out by using the validate_protocols key in your configuration:

      validate_protocols: false

      Marcelo Fabri #4430

    • Report how much memory was used when --benchmark is specified.
      JP Simard

    • Adds NSError to the list of types in discouraged_direct_init.
      jszumski #4508

    • ๐Ÿ›  Fix SwiftLint support on Xcode Cloud.
      JagCesar westerlund #4484

    • Add no_magic_numbers rule to avoid "Magic Numbers".
      Henrik Storch #4031

    • Add new option only_enforce_before_trivial_lines to vertical_whitespace_closing_braces rule. It restricts the rule to apply only before trivial lines (containing only closing braces, brackets and parentheses). This allows empty lines before non-trivial lines of code (e.g. if-else-statements).
      benjamin-kramer #3940

    ๐Ÿ› Bug Fixes

    • Respect validates_start_with_lowercase option when linting function names.
      Chris Brakebill #2708

    • Do not report variables annotated with @NSApplicationDelegateAdaptor and @WKExtensionDelegateAdaptor in weak_delegate rule.
      Till Hainbach #3598 #3611

    • ๐Ÿ›  Fix false-positives related to the willMove lifecycle method in type_contents_order rule.
      SimplyDanny #3478

    • Do no longer autocorrect usage of NSIntersectionRect in legacy_nsgeometry_functions rule.
      SimplyDanny #3703

    • ๐Ÿ›  Fix Analyzer rules in Xcode 14.
      SimplyDanny #4208

    • โž• Add column for SourceKit usage to rules command.
      JP Simard

    • Make nsobject_prefer_isequal rule work for nested @objc classes. Also consider the @objcMembers annotation.

    • ๐Ÿ–จ Print fixed content at most once to STDOUT.
      SimplyDanny #4211

    • ๐Ÿ›  Fix fatal error when content given via STDIN is corrected in the trailing_newline rule.
      SimplyDanny #4234

    • Fix false-positives from multiline_arguments_brackets when a function call has a single line trailing closure.
      CraigSiemens #4510

  • v0.49.1 Changes

    ๐Ÿ‘• Note: The default branch for the SwiftLint git repository was renamed from โšก๏ธ master to main on September 1st. Please update any code or automation accordingly.

    ๐Ÿ’ฅ Breaking

    • None.


    • None.

    โœจ Enhancements

    • โž• Add new self_binding opt-in rule to enforce that self identifiers are consistently re-bound to a common identifier name. Configure bind_identifier to the name you want to use. Defaults to self.
      JP Simard #2495

    • โž• Add --output option to lint and analyze commands to write to a file instead of to stdout.
      JP Simard #4048

    • โž• Add --progress flag to lint and analyze commands to show a live-updating progress bar instead of each file being processed.
      JP Simard

    • ๐Ÿ–จ --fix now works with --use-stdin, printing the output to to STDOUT instead of crashing.
      SimplyDanny #4127

    ๐Ÿ› Bug Fixes

    • โœ… Migrate empty_xctest_method rule to SwiftSyntax fixing some false positives.
      SimplyDanny #3647 #3691

    • Fix false positives in redundant_discardable_let when using async let.
      Martin Hosna #4142

    • ๐Ÿ–จ Consistently print error/info messages to stderr instead of stdout, which wasn't being done for errors regarding remote configurations.
      JP Simard

  • v0.49.0 Changes

    ๐Ÿ‘• Note: The default branch for the SwiftLint git repository will be renamed from โšก๏ธ master to main on September 1st. Please update any code or automation accordingly.

    ๐Ÿ’ฅ Breaking

    • ๐Ÿ‘• SwiftLint now requires Swift 5.6 or higher to build, and macOS 12 or higher to run.
      JP Simard

    • ๐Ÿ–จ Code Climate reports now use SHA256 strings as the issue fingerprint values.
      JP Simard

    • ๐Ÿ‘‰ Make comma_inheritance an opt-in rule.
      Steve Madsen #4027

    • ๐Ÿ—„ The autocorrect command that was deprecated in 0.43.0 has now been completely removed. Use --fix instead.
      JP Simard

    • โœ‚ Remove the AutomaticTestableRule protocol. All examples listed in rules are now tested automatically to make sure they are correct.

    • ๐Ÿ‘• Deprecate the --in-process-sourcekit command line flag. SwiftLint now always uses an in-process SourceKit.
      JP Simard


    • None.

    โœจ Enhancements

    • Make duplicate_imports rule correctable. Fix duplicate_imports rule reporting redundant violations when more than one duplicate is present.
      Timofey Solonin

    • ๐Ÿ‘Œ Support for building SwiftLint with bazel.
      JP Simard

    • ๐Ÿ‘Œ Support for writing custom private native rules when building with bazel.
      JP Simard Keith Smiley #3516

    • ๐Ÿ‘‰ Make comma rule about 10x faster, finding some previously missed cases and fixing some previously wrong corrections.
      JP Simard

    • ๐Ÿ‘‰ Make colon rule about 7x faster, finding some previously missed cases.
      JP Simard

    • ๐Ÿ‘‰ Make closure_spacing rule about 9x faster, finding some previously missed cases and fixing some previously wrong corrections.
      JP Simard SimplyDanny #4090

    • Introduce new configuration option include_compiler_directives (true by default) for the indentation_width rule that allows to ignore compiler directives in the indentation analysis. This is especially useful if one (or a formatter) prefers to have compiler directives always at the very beginning of a line.
      SimplyDanny #4030

    • Enable (recursive) globs in included file paths.

    • Custom rules are now broken down per rule instead of in aggregate in --benchmark.
      JP Simard

    • ๐Ÿ–จ The version command now has an optional --verbose flag that prints out the full version info, notably the build ID, which can be used to determine if two swiftlint executables are identical.
      JP Simard

    • Update documentation for multiline_arguments_brackets and multiline_literal_brackets to make it immediately obvious that common examples will trigger.
      chrisjf #4060

    • ๐Ÿ“œ The --compile-commands argument can now parse SwiftPM yaml files produced when running swift build at .build/{debug,release}.yaml.
      JP Simard

    • Add new configuration option allowed_no_space_operators to operator_usage_whitespace rule. It allows to specify custom operators which shall not be considered by the rule.

    • โž• Add new protocols to remove some boilerplate involved in writing SwiftSyntax-based rules.
      JP Simard

    ๐Ÿ› Bug Fixes

    • Fix false positive in self_in_property_initialization rule when using closures inside didSet and other accessors.
      Marcelo Fabri #4041

    • ๐Ÿ›  Fix false positive in Duplicated Key in Dictionary Literal Violation rule when using keys that are generated at runtime with the same source code.
      OrEliyahu #4012

    • ๐Ÿ›  Fix false positive in yoda_condition rule by basing it on SwiftSyntax.
      SimplyDanny #4081

    • ๐Ÿ›  Fix false negatives in first_where rule when filtering array of dictionaries with String keys.

    • ๐Ÿ›  Fix broken correction for explicit_init rule.

  • v0.48.0 Changes

    ๐Ÿš€ This is the last release to support building with Swift 5.5.x and running on ๐ŸŽ macOS < 12.

    ๐Ÿ’ฅ Breaking

    • ๐Ÿ‘• Deprecate the --path options for lint/analyze commands. Prefer the positional paths that can be added last to both commands.


    • None.

    โœจ Enhancements

    • ๐Ÿ‘Œ Support iOSApplicationExtension, macOSApplicationExtension, watchOSApplicationExtension, and tvOSApplicationExtension identifiers in the deployment_target rule. To configure the rule for these identifiers, you need to use the keys iOSApplicationExtension_deployment_target, macOSApplicationExtension_deployment_target, watchOSApplicationExtension_deployment_target, and tvOSApplicationExtension_deployment_target. Extentions default to their counterparts unless they are explicitly defined.
      tahabebek #4004

    • Rewrite operator_usage_whitespace rule using SwiftSyntax, fixing false positives and false negatives.
      Note that this rule doesn't catch violations around return arrows (->) anymore - they are already handled by return_arrow_whitespace.
      Marcelo Fabri #3965 #3668 #2728

    • ๐Ÿ‘Œ Support arrays for the included and excluded options when defining a custom rule.
      Marcelo Fabri

    • Add back void_function_in_ternary opt-in rule to warn against using a ternary operator to call Void functions.
      Marcelo Fabri

    • Support UIEdgeInsets type in prefer_zero_over_explicit_init rule.
      KokiHirokawa #3986

    ๐Ÿ› Bug Fixes

    • Ignore array types in syntactic_sugar rule if their associated Index is accessed.
      SimplyDanny #3502

    • Prevent crash for private types named _ in type_name rules. sinoru #3971

    • ๐Ÿ‘‰ Make for_where rule implementation independent of order in structure dictionary. This fixes the rule in Xcode 13.3 where some violation were no longer reported.
      SimplyDanny #3975

    • โšก๏ธ Update result builder methods in unused_declaration rule fixing some false-positives.

    • Look for call expressions which are not wrapped into an argument when checking for nested (possibly multiline) arguments fixing some false-negatives in (at least) Xcode 13.2.
      SimplyDanny #3975

    • ๐Ÿ›  Make sure that include paths prefixed with the name of the original path are included in the analysis.
      SimplyDanny #3705

    • Do not trigger unavailable_condition rule if other #(un)available checks are involved.
      SimplyDanny #3985

    • โšก๏ธ Update nimble_operator to support the operators for beNil().

    • Avoid false-positive in let_var_whitespace rule by allowing custom attributes on lines directly before let/var declarations.
      SimplyDanny #2980

  • v0.47.1 Changes

    ๐Ÿ’ฅ Breaking

    • None.


    • None.

    โœจ Enhancements

    • Add new option only_enforce_before_trivial_lines to vertical_whitespace_closing_braces rule. It restricts the rule to apply only before trivial lines (containing only closing braces, brackets and parentheses). This allows empty lines before non-trivial lines of code (e.g. if-else-statements).
      benjamin-kramer #3940

    • โž• Add type-checked analyzer rule version of ArrayInitRule named TypesafeArrayInitRule with identifier typesafe_array_init that avoids the false positives present in the lint rule.
      SimplyDanny #3749

    • โž• Add the --in-process-sourcekit command line flag to lint and analyze commands, which has the same effect as setting the IN_PROCESS_SOURCEKIT environment variable.
      Juozas Valancius

    • โž• Add a new artifactbundle release asset containing swiftlint binaries for x86 & arm64 macOS.
      Juozas Valancius #3840

    • Add back return_value_from_void_function opt-in rule to warn against using return <expression> in a function that returns Void.
      Marcelo Fabri

    • โš  Don't skip autocorrect on files that have parser warnings. Only files with errors reported by the Swift parser will be skipped.
      Marcelo Fabri #3343

    • Add accessibility_label_for_image rule to warn if a SwiftUI Image does not have an accessibility label and is not hidden from accessibility.
      Ryan Cole

    • โž• Add unavailable_condition rule to prefer using if #unavailable instead of if #available with an empty body and an else condition when using Swift 5.6 or later.
      Marcelo Fabri #3897

    • โž• Add comma_inheritance rule to validate that inheritance clauses use commas instead of &.
      Marcelo Fabri #3950

    ๐Ÿ› Bug Fixes

    • Fix false positives in unused_closure_parameter when using parameters with backticks.
      JP Simard #3628

    • ๐Ÿ‘Œ Improved the syntactic_sugar rule's detection accuracy and fixed some corrections leading to invalid code.
      Paul Taykalo #3866

    • ๐Ÿ›  Fix analyzer rules with Xcode 13.3 / Swift 5.6. Note that we've measured performance regressions compared to Swift 5.5 on the order of about 2x.
      JP Simard #3920

    • 0๏ธโƒฃ Error by default on bad expiring todo date formatting.
      Christopher Hale #3636

    • ๐Ÿ‘• Lint/analyze all files listed in the command even if the --path option is used.

  • v0.47.0 Changes

    ๐Ÿ’ฅ Breaking

    • ๐Ÿ‘• SwiftLint now requires Swift 5.5 or higher to build.
      JP Simard

    • ๐Ÿ‘• The SwiftLintFramework podspec has been removed. To our knowledge, this was completely unused by other projects and was not worth the complexity needed to justify its continued maintenance, especially in light of the integration of SwiftSyntax. The SwiftLint podspec is still supported.
      JP Simard

    • ๐Ÿ‘• SwiftLint now requires at least Swift 5.0 installed in order to lint files.
      Marcelo Fabri


    • ๐Ÿ“œ The force_cast rule and the comment command parsing mechanism have been updated to use SwiftSyntax instead of SourceKit. Please report any problems you encounter by opening a GitHub issue. If this is successful, more rules may use Swift Syntax in the future.
      JP Simard

    โœจ Enhancements

    • Empty files no longer trigger any violations.
      JP Simard #3854

    • ๐Ÿ‘Œ Support recursive globs.
      funzin JP Simard #3789 #3891

    • 0๏ธโƒฃ The legacy_random rule is now enabled by default.
      Marcelo Fabri

    • ๐Ÿš€ The deployment_target rule now supports the #unavailable syntax added in Swift 5.6.
      Marcelo Fabri #3896

    • ๐Ÿ–จ Set the IN_PROCESS_SOURCEKIT environment variable, which will use the in-process version of sourcekitd on macOS when Xcode 13 or later is selected. This avoids the use of XPC, which is prohibited in some sandboxed environments, such as in Swift Package Manager plugins.
      Juozas Valancius

    • โž• Add ability to run only one (focused) example.
      PaulTaykalo #3911

    ๐Ÿ› Bug Fixes

    • Extend class_delegate_protocol to correctly identify cases with the protocol body opening brace on a new line.

    • ๐Ÿ›  Fix SwiftLint.pkg installer installing multiple copies of SwiftLint.
      JP Simard #3815 #3887

  • v0.46.5 Changes

    ๐Ÿ’ฅ Breaking

    • None.


    • None.

    โœจ Enhancements

    • None.

    ๐Ÿ› Bug Fixes

    • Fix empty_parentheses_with_trailing_closure rule when using Swift 5.6.
      Marcelo Fabri #3846

    • Fix false negatives in closure_parameter_position rule with Swift 5.6.
      Marcelo Fabri #3845

    • ๐Ÿ›  Fix regression in last_where rule when using Swift 5.6.
      Marcelo Fabri #3847

    • ๐Ÿ›  Fix regression in unused_import rule when using Swift 5.6.
      JP Simard #3849

    • ๐Ÿ›  Fix regression in trailing_closure rule when using Swift 5.6.
      Marcelo Fabri #3848

  • v0.46.4 Changes

    ๐Ÿ’ฅ Breaking

    • None.


    • None.

    โœจ Enhancements

    • None.

    ๐Ÿ› Bug Fixes

    • Ignore meta class types in prefer_self_in_static_references rule.
      SimplyDanny #3804

    • Ignore MARK in multiline comment, fixing cases that would previously crash or produce invalid results when correcting.
      goranche #1749 #3841

    • ๐Ÿ›  Fix false positive in EmptyEnumArgumentsRule rule when using Swift 5.6.
      Marcelo Fabri #3850

  • v0.46.3 Changes

    ๐Ÿ’ฅ Breaking

    • None.


    • None.

    โœจ Enhancements

    • ๐Ÿ”„ Change fingerprint generation in CodeClimateReporter.swift to use the relative file path to better support CI/CD on multiple machines.
      HA Pors

    ๐Ÿ› Bug Fixes

    • Fix crash in the closure_end_indentation rule when linting with Swift 5.6.
      JP Simard #3830

    • ๐Ÿ›  Fix default rules section in documentation.
      Natan Rolnik #3857