SwiftLint v0.50.0 Release Notes

  • ๐Ÿ’ฅ 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 https://github.com/apple/swift/issues/51036 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