Handy RxSwift extensions on NSObject, including rx.disposeBag.

Overview

CircleCI

NSObject+Rx

If you're using RxSwift, you've probably encountered the following code more than a few times.

class MyObject: Whatever {
	let disposeBag = DisposeBag()

	...
}

You're actually not the only one; it has been typed many, many times.

Search screenshot showing many, many results.

Instead of adding a new property to every object, use this library to add it for you, to any subclass of NSObject.

thing
  .bind(to: otherThing)
  .disposed(by: rx.disposeBag)

Sweet.

It'll work just like a property: when the instance is deinit'd, the DisposeBag gets disposed. It's also a read/write property, so you can use your own, too.

If you want to add a DisposeBag to an Object that does not inherit from NSObject, you can also implement the protocol HasDisposeBag, and you're good to go. This protocol provides a default DisposeBag called disposeBag.

Installing

CocoaPods

Add to your Podfile:

pod 'NSObject+Rx'

And that'll be 👌

Carthage

Add to Cartfile:

github "RxSwiftCommunity/NSObject-Rx"

Add frameworks to your project (no need to "copy items if needed")

Run carthage update or carthage update --platform ios if you target iOS only

Add run script build phase /usr/local/bin/carthage copy-frameworks with input files being:

$(SRCROOT)/Carthage/Build/iOS/RxSwift.framework
$(SRCROOT)/Carthage/Build/iOS/NSObject_Rx.framework

And rule ✌️

Contributing

Source files are in the root directory. We use CocoaPods to develop, check out the unit tests in the Demo project.

License

MIT obvs.

Tim Cook dancing to the sound of a permissive license.

Comments
  • disposeBag: add a HasDisposeBag protocol

    disposeBag: add a HasDisposeBag protocol

    In this commit, we try to conform to protocol oriented programming. It is more flexible to introduce a DisposeBagable protocol so that every object that respect this one can have a DisposeBag (NSObject does respect that protocol now)

    opened by twittemb 34
  • feature: rehabilitates the HasDisposeBag protocol

    feature: rehabilitates the HasDisposeBag protocol

    the HasDisposeBag protocol is back, but doest not share anymore code with AnyObject extension, so there is no collision between self and base references

    opened by twittemb 19
  • rx.disposeBag may be using wrong address

    rx.disposeBag may be using wrong address

    I think rx.disposeBag is doing some wrong memory stuff. Take a look at this post. I'm investigating now but might be helpful if you take a look as well.

    https://github.com/ReactiveX/RxSwift/issues/1439

    Check kzaher comment:

    Usually what happens is that somebody is using objc_getAssociatedObject and objc_setAssociatedObject inside rx extension in this form objc_getAssociatedObject(self, ... vs the correct objc_getAssociatedObject(base, ....

    Because Swift has struct reusing, those two facts combined usually results in that kind of behavior.

    opened by grinder81 7
  • Allow usage of rx.disposeBag alongside rx_disposeBag

    Allow usage of rx.disposeBag alongside rx_disposeBag

    It seems to me having disposeBag scoped into the rx. prefix feel more in-line with the rest of How RxSwift 3.0 behaves, so felt this would be a nice touch-up. Of course totally open to any feedback.

    This allows using .addDisposableTo(rx.disposeBag)

    Thanks! :-)

    opened by freak4pc 6
  • Update configurations for the project

    Update configurations for the project

    Hi guys,

    Just a small changes in code. Big changes nevertheless updating the Pods.

    CHANGES:

    • Remove redundancy in the .gitignore regarding Carthage. • Update the dependencies in the Cartfile & Podfile • Update DemoTest to Swift 4 updating the project settings and removing warnings. • Replace the deprecated addDisposableTo(_:) in favor of disposed(by:) in the DemoTest.

    enhancement 
    opened by Vkt0r 5
  • Add info.plist to fix Carthage installation

    Add info.plist to fix Carthage installation

    By https://github.com/RxSwiftCommunity/NSObject-Rx/pull/42 , info.plist had been deleted, and so Carthage installation is failed with this error log.

    Failed to read file or folder at /Users/mono/Library/Caches/org.carthage.CarthageKit/DerivedData/9.0_9A235/NSObject-Rx/3.0.0/Build/Products/Release-iphoneos/NSObject_Rx.framework

    So I added info.plist to fix Carthage installation.

    opened by mono0926 5
  • Added rx_observableForSelector to NSObject

    Added rx_observableForSelector to NSObject

    Hi, guys I remember we had some discussion regarding observing method calls on main Rx repo

    Almost all implementation has been taken from RAC

    I'm still not sure about naming conventions and whether I completely covered implementation with test, and whether you want this feature in this repo :)

    But I open for discussion :)

    opened by sergdort 5
  • Xcode8 GM and swift3

    Xcode8 GM and swift3

    currently only the RxSwift develop branch builds OK hence the reference to the branch, adjusted the version according to semver rules, updated the travis image (let's hope that builds)

    includes https://github.com/RxSwiftCommunity/NSObject-Rx/pull/24

    opened by tcurdt 4
  • Release new version

    Release new version

    NSObject+RX v5.2.0 is NOT compatible with RxSwift v6.1.0 due to ~> 6.0.0 dependency version. There is a commit that fixes it, but new version haven't been released yet. Can you please release a new one?

    opened by ky1vstar 3
  • Add Support to RxSwift 6.1

    Add Support to RxSwift 6.1

    Motivation and Context

    When doing a pod update to update to RxSwift 6.10 (Ethan1) the NSObject+Rx reverts to 2.1.0 from 5.2.0 making NSObject+Rx break the build.

    Description

    • Update podspect
    • Update CircleCI config
    • Regenerate dependencies: pod update and carthage update
    opened by Guerrix 3
  • hotfix: RxSwift 4.0 and Carthage ketchup

    hotfix: RxSwift 4.0 and Carthage ketchup

    catch up*

    I've removed the missing HasDisposeBag.swift reference from the Xcode project so that the project compiles. Perhaps RxSwiftCommunity/NSObject-Rx/pull/49 can suitably add it back.

    opened by Gurpartap 3
  • Bump tzinfo from 1.2.7 to 1.2.10

    Bump tzinfo from 1.2.7 to 1.2.10

    Bumps tzinfo from 1.2.7 to 1.2.10.

    Release notes

    Sourced from tzinfo's releases.

    v1.2.10

    TZInfo v1.2.10 on RubyGems.org

    v1.2.9

    • Fixed an incorrect InvalidTimezoneIdentifier exception raised when loading a zoneinfo file that includes rules specifying an additional transition to the final defined offset (for example, Africa/Casablanca in version 2018e of the Time Zone Database). #123.

    TZInfo v1.2.9 on RubyGems.org

    v1.2.8

    • Added support for handling "slim" format zoneinfo files that are produced by default by zic version 2020b and later. The POSIX-style TZ string is now used calculate DST transition times after the final defined transition in the file. The 64-bit section is now always used regardless of whether Time has support for 64-bit times. #120.
    • Rubinius is no longer supported.

    TZInfo v1.2.8 on RubyGems.org

    Changelog

    Sourced from tzinfo's changelog.

    Version 1.2.10 - 19-Jul-2022

    Version 1.2.9 - 16-Dec-2020

    • Fixed an incorrect InvalidTimezoneIdentifier exception raised when loading a zoneinfo file that includes rules specifying an additional transition to the final defined offset (for example, Africa/Casablanca in version 2018e of the Time Zone Database). #123.

    Version 1.2.8 - 8-Nov-2020

    • Added support for handling "slim" format zoneinfo files that are produced by default by zic version 2020b and later. The POSIX-style TZ string is now used calculate DST transition times after the final defined transition in the file. The 64-bit section is now always used regardless of whether Time has support for 64-bit times. #120.
    • Rubinius is no longer supported.
    Commits
    • 0814dcd Fix the release date.
    • fd05e2a Preparing v1.2.10.
    • b98c32e Merge branch 'fix-directory-traversal-1.2' into 1.2
    • ac3ee68 Remove unnecessary escaping of + within regex character classes.
    • 9d49bf9 Fix relative path loading tests.
    • 394c381 Remove private_constant for consistency and compatibility.
    • 5e9f990 Exclude Arch Linux's SECURITY file from the time zone index.
    • 17fc9e1 Workaround for 'Permission denied - NUL' errors with JRuby on Windows.
    • 6bd7a51 Update copyright years.
    • 9905ca9 Fix directory traversal in Timezone.get when using Ruby data source
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump jmespath from 1.4.0 to 1.6.1

    Bump jmespath from 1.4.0 to 1.6.1

    Bumps jmespath from 1.4.0 to 1.6.1.

    Release notes

    Sourced from jmespath's releases.

    Release v1.6.1 - 2022-03-07

    • Issue - Use JSON.parse instead of JSON.load.

    Release v1.6.0 - 2022-02-14

    • Feature - Add support for string comparissons.

    Release v1.5.0 - 2022-01-10

    • Support implicitly convertible objects/duck-type values responding to to_hash and to_ary.

      [See related GitHub pull request #51](jmespath/jmespath.rb#51).

    Changelog

    Sourced from jmespath's changelog.

    1.6.1 (2022-03-07)

    • Issue - Use JSON.parse instead of JSON.load.

    1.6.0 (2022-02-14)

    • Feature - Add support for string comparisons.

    1.5.0 (2022-01-10)

    • Support implicitly convertible objects/duck-type values responding to to_hash and to_ary.

      [See related GitHub pull request #51](jmespath/jmespath.rb#51).

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump cocoapods-downloader from 1.3.0 to 1.6.3

    Bump cocoapods-downloader from 1.3.0 to 1.6.3

    Bumps cocoapods-downloader from 1.3.0 to 1.6.3.

    Release notes

    Sourced from cocoapods-downloader's releases.

    1.6.3

    Enhancements
    • None.
    Bug Fixes
    • None.

    1.6.2

    Enhancements
    • None.
    Bug Fixes
    • None.

    1.6.1

    Enhancements
    • None.
    Bug Fixes
    • None.

    1.6.0

    Enhancements
    • None.
    Bug Fixes
    • Adds a check for command injections in the input for hg and git.
      orta #124

    1.5.1

    Enhancements
    • None.
    Bug Fixes
    • Fix "can't modify frozen string" errors when pods are integrated using the branch option
      buju77 #10920

    1.5.0

    ... (truncated)

    Changelog

    Sourced from cocoapods-downloader's changelog.

    1.6.3 (2022-04-01)

    Enhancements
    • None.
    Bug Fixes
    • None.

    1.6.2 (2022-03-28)

    Enhancements
    • None.
    Bug Fixes
    • None.

    1.6.1 (2022-03-23)

    Enhancements
    • None.
    Bug Fixes
    • None.

    1.6.0 (2022-03-22)

    Enhancements
    • None.
    Bug Fixes
    • Adds a check for command injections in the input for hg and git.
      orta #124

    1.5.1 (2021-09-07)

    Enhancements
    • None.

    ... (truncated)

    Commits
    • c03e2ed Release 1.6.3
    • f75bccc Disable Bazaar tests due to macOS 12.3 not including python2
    • 52a0d54 Merge pull request #128 from CocoaPods/validate_before_dl
    • d27c983 Ensure that the git pre-processor doesn't accidentally bail also
    • 3adfe1f [CHANGELOG] Add empty Master section
    • 591167a Release 1.6.2
    • d2564c3 Merge pull request #127 from CocoaPods/validate_before_dl
    • 99fec61 Switches where we check for invalid input, to move it inside the download fun...
    • 96679f2 [CHANGELOG] Add empty Master section
    • 3a7c54b Release 1.6.1
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 1
  • Can't compile with Cocopods and Xcode 12

    Can't compile with Cocopods and Xcode 12

    
    > Copying Moya-umbrella.h
    
    [x] /Users/alouanemed/Projects/a-iOS/Pods/_Prebuild/Moya/Sources/RxMoya/MoyaProvider+Rx.swift:2:8: compiling for iOS 10.0, but module 'RxSwift' has a minimum deployment target of iOS 12.0: /Users/alouanemed/Projects/a-iOS/Pods/build/Release-iphoneos/RxSwift/RxSwift.framework/Modules/RxSwift.swiftmodule/arm64-apple-ios.swiftmodule
    
    import RxSwift
           ^
    
    
    > Linking Alamofire
    > Linking Alamofire
    
    opened by alouanemed 1
  • iOS Crash,  memory management error

    iOS Crash, memory management error

    iOS Crash, I think it is caused by memory management error when using third party library NSObject+Rx and Then?

    Could you give me some tips?

    Firebase crashlytics reports,

    已崩溃:com.apple.main-thread EXC_BREAKPOINT 0x0000000104a5be14

    0 IOS LoginRegisterInputView.swift - 第 328 行 closure #5 in LoginRegisterInputView.initRegisterUI()

    1 Then $S4ThenAAPAARlzCrlE4thenyxyxKXEKF + 32

    2 IOS LoginRegisterInputView.swift - 第 314 行 LoginRegisterInputView.initRegisterUI()

    3 IOS LoginRegisterInputView.swift - 第 225 行 LoginRegisterInputView.initUI(style:)

    4 IOS LoginRegisterInputView.swift - 第 42 行 specialized LoginRegisterInputView.init(style:rootVC:)

    Here is the code:

    let registerProtocolLabel = UILabel().then {
                let string = "RegisterIterm".localized().replacingOccurrences(of: "<a>", with: "+").replacingOccurrences(of: "</a>", with: "+")
                let array:[String] = string.components(separatedBy: "+")
                $0.font = mThemeMinFont
                if array.count > 0 {
                    $0.attributedText = (array[0].color(mRGBA(120, 120, 120, 1)) + array[1].color(mThemePinkColor).underline + array[2].color(mRGBA(120, 120, 120, 1))).attributedText
                }
                $0.textAlignment = .left
                $0.numberOfLines = 0
                $0.lineBreakMode = .byWordWrapping
                $0.rx.tapGesture().when(.recognized)
                    .subscribe(onNext:{ _ in
                     AppUtils.jumpToWebView(route: AppUtils.getFunctionUrl(.term))
                    }).disposed(by: rx.disposeBag)
            }
    

    The code is of bugs and nasty. It is not written by me, not by my colleague.

    Now I am in charge of the bugs.

    Reading from then, it is very easy. I have a crash question, And I asked in [StackOverFlow](iOS Crash, memory management error when using NSObject+Rx and Then?)

    The object just set its properties in the closure. It does not visit other properties. So it is very ARC, it will not interfere other objects' memory management.

    While my colleague's code is not of Then, it did two much.

    I think the crash is caused by NSObject+Rx.

    NSObject+Rx's code is easy, just code sugar.

    /// a unique DisposeBag that is related to the Reactive.Base instance only for Reference type
        public var disposeBag: DisposeBag {
            get {
                return synchronizedBag {
                    if let disposeObject = objc_getAssociatedObject(base, &disposeBagContext) as? DisposeBag {
                        return disposeObject
                    }
                    let disposeObject = DisposeBag()
                    objc_setAssociatedObject(base, &disposeBagContext, disposeObject, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
                    return disposeObject
                }
            }
    

    Reading from the source code of NSObject+Rx, in the scene above ,I think rx.disposeBag is equal to label.rx.disposeBag.

    It may cause bugs.

    RxSwift's source code is a little hard to read.

    So what is the crash reason?

    opened by BoxDengJZ 1
Releases(5.1.1)
Owner
RxSwift Community
RxSwift ecosystem projects
RxSwift Community
RxSwift extensions for Core Data

RxCoreData Example To run the example project, clone the repo, and run pod install from the Example directory first. Requirements Xcode 9.0 Swift 4.0

RxSwift Community 164 Oct 14, 2022
Super Simple Pager with RxSwift extension

SSPager Super Simple Pager Example To run the example project, clone the repo, and run pod install from the SSPagerExample directory first. Installati

9oya 4 Jul 10, 2022
RxSwift extentions for Swift optionals and "Occupiable" types

RxOptional RxSwift extentions for Swift optionals and "Occupiable" types. Usage All operators are available on Driver as well unless otherwise marked.

Thane Gill 8 Jun 28, 2020
RxSwift bindings for Permissions API in iOS.

RxPermission RxSwift bindings for Permission API that helps you with Permissions in iOS. Installation RxPermission is available through CocoaPods. I c

Luke 230 Dec 27, 2022
RxSwift wrapper around the elegant HTTP networking in Swift Alamofire

RxAlamofire RxAlamofire is a RxSwift wrapper around the elegant HTTP networking in Swift Alamofire. Getting Started Wrapping RxSwift around Alamofire

RxSwift Community 1.6k Jan 3, 2023
RxSwift extension for RealmSwift's types

RxRealm This library is a thin wrapper around RealmSwift ( Realm Docs ). Table of contents: Observing object collections Observing a single object Wri

RxSwift Community 1.1k Jan 6, 2023
A testable RxSwift wrapper around MultipeerConnectivity

A testable RxSwift wrapper around MultipeerConnectivity RxMultipeer is a RxSwift wrapper for MultipeerConnectivity. Using the adapter pattern, we can

RxSwift Community 69 Jul 5, 2022
iOS & OSX Bluetooth library for RxSwift

RxBluetoothKit is a Bluetooth library that makes interaction with BLE devices much more pleasant. It's backed by RxSwift and CoreBluetooth and it prov

Polidea 1.3k Dec 16, 2022
RxSwift reactive wrapper for view gestures

RxGesture Usage To run the example project, clone the repo, in the Example folder open RxGesture.xcworkspace. You might need to run pod install from t

RxSwift Community 1.3k Dec 30, 2022
🤖 RxSwift + State Machine, inspired by Redux and Elm.

RxAutomaton RxSwift port of ReactiveAutomaton (State Machine). Terminology Whenever the word "signal" or "(signal) producer" appears (derived from Rea

Yasuhiro Inami 719 Nov 19, 2022
STDevRxExt contains some extension functions for RxSwift and RxCocoa which makes our live easy.

STDevRxExt Example To run the Example.playground, clone the repo, and run pod install from the Example directory first. Requirements iOS 9.0+ tvOS 9.0

STDev 6 Mar 26, 2021
RxAlamoRecord combines the power of the AlamoRecord and RxSwift libraries to create a networking layer that makes interacting with API's easier than ever reactively.

Written in Swift 5 RxAlamoRecord combines the power of the AlamoRecord and RxSwift libraries to create a networking layer that makes interacting with

Dalton Hinterscher 9 Aug 7, 2020
Support Combine Assign subscriber in RxSwift.

RxAssign Support Combine Assign subscriber in RxSwift. Assign uses a KeyPath which is really nice and useful. ** RxAssign extends Driver and Signal in

Won Heo 3 Dec 7, 2021
This is the demo of MVVM-C structure with dependency injection using RxSwift.

MVVMC-Demo Demo defination This is the demo project, I have integrated two APIs for MovieDB APIS (https://www.themoviedb.org/). One for the listing of

Anshul Shah 61 Dec 6, 2022
Set of useful extensions for ReactiveSwift & ReactiveCocoa

ACKReactiveExtensions ACKReactiveExtensions is set of useful extensions for ReactiveCocoa you could use in your apps. Currently we have extensions for

Ackee 17 Aug 12, 2022
Handy Combine extensions on NSObject, including Set.

Storable Description If you're using Combine, you've probably encountered the following code more than a few times. class Object: NSObject { var c

hcrane 23 Dec 13, 2022
A handy collection of more than 500 native Swift extensions to boost your productivity.

SwifterSwift is a collection of over 500 native Swift extensions, with handy methods, syntactic sugar, and performance improvements for wide range of

SwifterSwift 12k Jan 7, 2023
SharkUtils is a collection of Swift extensions, handy methods and syntactical sugar that we use within our iOS projects at Gymshark.

SharkUtils is a collection of Swift extensions, handy methods and syntactical sugar that we use within our iOS projects at Gymshark.

Gymshark 1 Jul 6, 2021
A handy collection of more than 500 native Swift extensions to boost your productivity.

SwifterSwift is a collection of over 500 native Swift extensions, with handy methods, syntactic sugar, and performance improvements for wide range of

SwifterSwift 12k Jan 7, 2023
Easy JSON to NSObject mapping using Cocoa's key value coding (KVC)

#Motis Object Mapping Easy JSON to NSObject mapping using Cocoa's key value coding (KVC) Motis is a user-friendly interface with Key Value Coding that

Mobile Jazz 249 Jun 29, 2022