Pointers for migration between major versions.
Demo video: Updating from R.swift 6 to Rswift 7
- Strings are always formatted using
String(format:)
, even strings without arguments, make sure to escape any percentage signs (%
) with%%
- Use a custom language:
R.string(preferredLanguages: ["fr"]).example.hello()
If you're using Swift Package Manager:
- Separate R.swift.Library is no longer needed, remove dependency on that package
R.generated.swift
file is no longer needed in the project, delete the file- Remove custom Run Script Build Phase that invokes
rswift
binary - Add SPM dependency on
github.com/mac-cain13/R.swift.git
package - Add
RswiftLibrary
to your targets - Under "Run Build Tool Plug-ins" Build Phase, add
RswiftGenerateInternalResources
orRswiftGeneratePublicResources
(Screenshot) - Right-click on your project, and run
RswiftXcodeModifyPackages
to modify your Xcode project so that the build tool plug-in will actually run during builds (this seems to fix a bug in Xcode?) (Screenshot)
If you're using Mint or manual call rswift
executable:
- Separate R.swift.Library is no longer needed, remove dependency on that package
- Add SPM dependency on
github.com/mac-cain13/R.swift.git
package - Add
RswiftLibrary
to your targets
Changes to the commandline tool rswift
(not relevant when using SPM):
- Argument
accessLevel
renamed toaccess-level
- Argument
generateUITestFile
removed, if you need a separate file with just ids, call rswift a second time with--generators id
- Argument
hostingBundle
removed, bundle can be specified in code:_R(bundle: someBundle)
- Arguments removed:
bundleIdentifier
,productModuleName
,infoPlistFile
,codeSignEntitlements
,builtProductsDir
,developerDir
,platformDir
,sdkRoot
,sourceRoot
. Use environment variables instead.
Internal changes in the Rswift support library:
- Support for
R.nib.XXX.secondView
to.twentiethView
has been removed, only.firstView
remains - Renamed internal module, update
import Rswift
toimport RswiftResources
- Removed protocols:
ColorResourceType
,FileResourceType
,FontResourceType
,IdentifierType
,ImageResourceType
,StoryboardViewControllerResourceType
,StringResourceType
,Validatable
- Added
StringResource1
up toStringResource9
, for strings with parameters - Renamed types:
ReuseIdentifierType
toReuseIdentifierContainer
NibResourceType
toNibReferenceContainer
StoryboardResourceType
toStoryboardReference
StoryboardResourceWithInitialControllerType
toInitialControllerContainer
TypedStoryboardSegueInfo
toTypedSegue
StoryboardSegueIdentifier
toSegueIdentifier
When using a Swift Package Manager Plugin on a Continuous Integration (CI) server, you may see the following error:
The following build commands failed: Validate plug-in “RswiftGeneratePublicResources” in package “r.swift”
To allow the running of plugins, pass -skipPackagePluginValidation
to xcbuildtool. See also this discussion on the Swift forums: https://forums.swift.org/t/telling-xcode-14-beta-4-to-trust-build-tool-plugins-programatically/59305
For users of Fastlane, pass the extra argument like so:
build_app(
...
xcargs: "-skipPackagePluginValidation"
...
)
- In the Build Phase, some changes are needed, see an example screenshot:
- Uncheck "Based on dependency analysis" so that R.swift is run on each build
- Remove
$TEMP_DIR/rswift-lastrun
from the "Input Files" of the Build Phase - Keep
$SRCROOT/[YOUR_PATH]/R.generated.swift
in the "Output Files" of the Build Phase unchanged
- Make sure you use Xcode 10 since we've adjusted to the SDK changes
- At the moment we are compatible with both Swift 4 and 4.2, this is more an accident then a feature, beware that we might drop Swift 4 support anytime.
If you are using the "New Build System":
- In the Build Phase you must perform some changes:
- Change the script to give the explicit output file, for example:
"$PODS_ROOT/R.swift/rswift" generate "$SRCROOT/[YOUR_PATH]/R.generated.swift"
- Add
$TEMP_DIR/rswift-lastrun
to the "Input Files" of the Build Phase - Add
$SRCROOT/[YOUR_PATH]/R.generated.swift
to the "Output Files" of the Build Phase
- Change the script to give the explicit output file, for example:
If you are using the "Legacy Build System":
- Add the flag
--disable-input-output-files-validation
and do not add input/output files to the Build Phase.
- Make sure you use Swift 4 / Xcode 9 since we've adjusted to the syntax and SDK changes.
- Running R.swift now requires the
generate
command, check the error R.swift outputs for upgrade instructions - Capitalization of methods and properties might have changed, in these cases the compiler should generate a fix-it for you.
- Support for CLR-files is deprecated, use the new named Color assets instead where possible.
- CLR based colors are moved from
R.color.*
toR.clr.*
- Support for CLR files will be removed in a later version
- At the moment we are compatible with both Swift 3.2 and Swift 4, this is more an accident then a feature, beware that we might drop Swift 3.2 support anytime.
- If you upgrade from Swift 2 we advise you to first migrate to Swift 3 / R.swift 3.0 and when that is done apply the migration to Swift 4 / R.swift 4.0
- Make sure you use Swift 3 / Xcode 8 since we've adjusted to the syntax changes.
- If you want to use Swift 2.3 / Xcode 8 use the latest R.swift 2 release.
- Some methods are renamed to match the new Swift 3 naming conventions, there are annotations available so the compiler can help you migrate.
- Make sure you use Swift 2.2 / Xcode 7.3 since we've adjusted to the syntax changes.
- iOS 7 support is dropped, use R.swift 0.13 if you still have to support it.
- Generated code now depends on the R.swift.Library, CocoaPods users don't need to do anything. Manual installation users need to include this library themselves, see the readme for instructions.
- In general; properties that created new stuff are now functions to represent better that they actually create a new instance.
R.image.settingsIcon
changed toR.image.settingsIcon()
R.file.someJson
changed toR.file.someJson()
R.storyboard.main.initialViewController
changed toR.storyboard.main.initialViewController()
R.storyboard.main.someViewController
changed toR.storyboard.main.someViewController()
- In general; Where you needed to use
.initialize()
to get the instance, a shorter function is available now:
R.storyboard.main.initialize()
changed toR.storyboard.main()
R.nib.someView.initiate()
changed toR.nib.someView()
- Nib root view loading changed from
R.nib.someView.firstView(nil, options: nil)
toR.nib.someView.firstView(owner: nil)
- Typed segue syntax changed from
segue.typedInfoWithIdentifier(R.segue.someViewController.someSegue)
toR.segue.someViewController.someSegue(segue: segue)
- Runtime validation changed:
R.validate()
now throws errors it encountersR.assertValid()
asserts on errors and only performs action in a debug/non-optimized build- For regular use cases using
R.assertValid()
is recommended