All Projects → krzysztofzablocki → Playgrounds

krzysztofzablocki / Playgrounds

Licence: other
Better playgrounds that work both for Objective-C and Swift

Programming Languages

swift
15916 projects
objective c
16641 projects - #2 most used programming language
shell
77523 projects
ruby
36898 projects - #4 most used programming language
c
50402 projects - #5 most used programming language

Projects that are alternatives of or similar to Playgrounds

jscore-playground
JavaScriptCore example for Swift Playgrounds
Stars: ✭ 17 (-99.34%)
Mutual labels:  playground, swift-playgrounds
Playground
Instantly create Swift playgrounds from the command line
Stars: ✭ 391 (-84.88%)
Mutual labels:  playground, swift-playgrounds
Playgroundbook
Tool for Swift Playground books
Stars: ✭ 257 (-90.06%)
Mutual labels:  playground, swift-playgrounds
hot-reload
Hot reload development for Go
Stars: ✭ 72 (-97.22%)
Mutual labels:  hot-reloading, hot-reload
Audiokit
Swift audio synthesis, processing, & analysis platform for iOS, macOS and tvOS
Stars: ✭ 8,827 (+241.34%)
Mutual labels:  playground, swift-playgrounds
active reloader rb
Rails gem that reloads browser as soon as any file is changed
Stars: ✭ 11 (-99.57%)
Mutual labels:  hot-reloading, hot-reload
Awesome Swift Playgrounds
A List of Awesome Swift Playgrounds
Stars: ✭ 3,521 (+36.16%)
Mutual labels:  playground, swift-playgrounds
systemjs-tools
(dev)tools for working with SystemJS
Stars: ✭ 41 (-98.41%)
Mutual labels:  hot-reloading, hot-reload
Hr4r
Example project - "Hot Reloading 4 RequireJS" front-end web applications & some extra code demonstrating hot-reloading for Node.js Express servers
Stars: ✭ 28 (-98.92%)
Mutual labels:  hot-reloading, hot-reload
Systemjs Hmr
Hot Module Replacement for SystemJS
Stars: ✭ 24 (-99.07%)
Mutual labels:  hot-reloading, hot-reload
Julia Set Playground
A Swift playground that generates beautiful Julia set fractal images.
Stars: ✭ 236 (-90.87%)
Mutual labels:  playground, swift-playgrounds
Systemjs Hot Reloader
reloads your modules as needed so that you can have satisfyingly fast feedback loop when developing your app
Stars: ✭ 215 (-91.69%)
Mutual labels:  hot-reloading, hot-reload
Jet Live
c++ hot code reload for linux and macos
Stars: ✭ 283 (-89.06%)
Mutual labels:  hot-reloading, hot-reload
Crx Hotreload
Chrome Extension Hot Reloader
Stars: ✭ 545 (-78.92%)
Mutual labels:  hot-reloading, hot-reload
Cssfx
Allow runtime modification of JavaFX CSS
Stars: ✭ 95 (-96.33%)
Mutual labels:  hot-reloading, hot-reload
Swift Playgrounds
Learning Swift by working through example code in playgrounds
Stars: ✭ 199 (-92.3%)
Mutual labels:  playground, swift-playgrounds
Fast portrait segmentation
Fast (aimed to "real time") Portrait Segmentation on mobile phone
Stars: ✭ 215 (-91.69%)
Mutual labels:  real-time
Omniscidb
OmniSciDB (formerly MapD Core)
Stars: ✭ 2,601 (+0.58%)
Mutual labels:  real-time
Yave
Yet Another Vulkan Engine
Stars: ✭ 211 (-91.84%)
Mutual labels:  real-time
Rtm3d
Unofficial PyTorch implementation of "RTM3D: Real-time Monocular 3D Detection from Object Keypoints for Autonomous Driving" (ECCV 2020)
Stars: ✭ 211 (-91.84%)
Mutual labels:  real-time

Swift Playgrounds... but supporting both Objective-C and Swift code, plus some superb features.

Watch demo

More in-depth overview video

Version License Platform

Playgrounds are one of the niftiest features of Swift. They allow you to quickly test out bits of code and see results in real time without going through traditional edit-compile-run-debug cycle.

"But surely playgrounds aren't possible in Objective-C" you say? ... In fact they can be much better than Swift ones.

Objective-C Playgrounds

Features:

  • Faster than Swift playgrounds (a lot)
  • Extra controls for tweaking:
    • values
    • images
  • Auto-animated values
  • Synchronizing DSL's
  • Buttons
  • IDE agnostic, once you run it, you can modify the code even from vim.
  • Full iOS simulator and access to all iOS features, so you can prototype production ready code.
  • Nice DSL for rapid prototyping
  • CocoaPods support, so you can add it to existing projects to experiment
  • Open source, anyone can contribute to make them better!

and it’s just a start.

Technical details

First, let’s establish naming:

  • Timeline is a place where you have snapshots and controls.
  • Worksheet is a place where you can add views / controls and have interaction with them. You can use all the stuff you’d normally use with iOS like UIGestureRecognizers etc.
  • Tick counter - number of times the code changes have been loaded, multiply by the time it takes to compile + load your project and you see how much time you saved.

DSL’s - Beautiful and fast way to prototype.

Timeline snapshots

KZPShow(obj)

  • CALayer
  • UIView
  • UIBezierPath
  • CGPathRef
  • CGImageRef
  • UIImage
  • NSString, with format or without
  • id

Implementing snapshotting for your custom classes

You can implement custom debug image:

- (UIImage*)kzp_debugImage;

If you have already implemented - (id)debugQuickLookObject that returns any of types supported by the KZPShow, you don’t need to do anything.

Controls

  • Button
KZPAction(@"Press me", ^{
// Magic code
})
  • Images

Picking an image from the library:

KZPAdjustImage(myImage);
KZPWhenChanged(myImage, ^(UIImage *img) {
  imageView.image = img;
});
  • Values
KZPAdjustValue(scale, 0.5f, 1.0f) //- for floats
KZPAdjustValue(position, 0, 100) //- for integers

you can also set default values:

KZPAdjustValue(position, 0, 100).defaultValue(50)
  • Block callbacks KZPAdjust are also available.

Animations

  • Block animation callback, code that will be executed with each screen refresh (display link). Useful for animating multiple values.
KZPAnimate(CGFloat from, CGFloat to, void (^block)(CGFloat));
KZPAnimate(void (^block)());
  • Auto-animated values, defines new variable and automatically animates them. AR -> AutoReverse
KZPAnimateValue(rotation, 0, 360)
KZPAnimateValueAR(scale, 0, 1)

Coordinating code execution

Executing code only once the value is set

KZPWhenSet(myImage, ^(UIImage *img) {
	//! magic
});

Executing code on value changes

KZPWhenChanged(myImage, ^(UIImage *img) {
	//! magic
});

Storing variables

Transient - Cleared with each code change

Instead of using instance variables / properties for KZPlayground class (you are fine to use them for normal classes that you create as part of playground), you should store playground specific variables that you need to reference between playground methods, eg. view you want to pan with UIPanGestureRecognizer inside transientObjects dictionary.

self.transientObjects[@"pannableView"] = view;

Persisted - Not cleared with recompilation

Implement setup method and use normal instance variables to store data you don't want to change on code change. eg. if you need to do some expensive operation.

Snapshots recorded during setup will persist in timeline.

- (void)setup
{
	self.data = [self fetchBigDataSet];
}

Installation and setup

KZPlayground is distributed as a CocoaPod: pod 'KZPlayground' so you can either add it to your existing project or clone this repository and play with it.

Remember to not add playgrounds in production builds (easy with new cocoapods configuration scoping).

Once you have pod installed, you need to create your playground, it’s simple:

  1. Subclass KZPPlayground
  2. Implement run method
  3. Conform to KZPActivePlayground protocol
    You can have many playgrounds in one project, but only one should be marked as KZPActivePlayground. It will be automatically loaded.
  4. present [KZPPlaygroundViewController playgroundViewController]

To apply your changes you have 2 approaches:

  1. Xcode/Appcode you can use cmd/ctrl + x (done via dyci plugin) while you are modifying your code.
  2. (My Preferrence) Automatic on file save (IDE agnostic) using kicker gem in terminal: (N.B. you need to have the kicker gem installed, see below)
kicker -sql 0.05 FOLDER_WITH_SOURCE_FILES

in case of Example project you'd call kicker from inside the project root folder (one containing the .kick file, which you will also need.)

kicker -sql 0.05 Example

This will react to all changes in .m files in the Example directory and reload your playground.

(Optional) Make Kicker autostart whenever you run your project

  1. Copy the .kick file to your project's directory.
  2. Add a new "Run Script" under your target's "Build Phases" tab with the following:
PID_PATH=/tmp/${PROJECT_NAME}_kicker.pid
if [ -e $PID_PATH ]
then
  kill $(cat $PID_PATH)
  rm $PID_PATH
fi
kicker -sql 0.05 . > /dev/null 2>&1 & echo $! > $PID_PATH

Note: You will need to manually kill the kicker process when you're done since it won't be killed after you stop running your project.

Only once

KZPlayground is powered by Code Injection, currently using Dyci code injection tool, you only need to install it once on your machine (You’ll need to reinstall it on Xcode updates):

git clone https://github.com/DyCI/dyci-main.git
cd dyci-main/Install/
./install.sh

In order to use the kicker gem, you need to install it as follows:

(sudo) gem install kicker

Swift support

My playgrounds now support Swift code, to use that you should use injectionforxcode instead of Dyci, make sure to grab 0.4 Release for some simpler API.

Contributing

Pull-requests are welcomed.

Changelog

0.4

  • Basic Swift support
  • Added Swift example

0.3.2

  • Ability to hide timeline

0.3.1

  • XCAsset images picking.
  • Persisting selected images.

0.3.0

  • Image picking.
  • Synchronisations.
  • Change observing.
  • Localizable strings are injected.

0.2.5

  • Persistent setup functionality.
  • Improved snapshots details.

0.2.0

  • All files in the project can be now changed to trigger playground reload.
  • Better kicker setup.
  • Transient objects.

License

KZPlayground is available under the modified MIT license. See the LICENSE file for more info.

Author

Krzysztof Zablocki, [email protected]

Follow me on twitter.

Check-out my blog or GitHub profile for more cool stuff.

Cool usages

Check out AudioKit examples using playgrounds

Attribution

SceneKit example code has been taken from David Ronnqvist upcoming SceneKit book, recommended.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].