All Projects → Yalantis → Ios Guidelines

Yalantis / Ios Guidelines

iOS Guidelines used in Yalantis ;)

Labels

Projects that are alternatives of or similar to Ios Guidelines

Displayswitcher
Custom transition between two collection view layouts
Stars: ✭ 2,253 (+1453.79%)
Mutual labels:  yalantis
Pulltomakeflight
Custom animated pull-to-refresh that can be easily added to UIScrollView
Stars: ✭ 497 (+242.76%)
Mutual labels:  yalantis
Pulltorefresh
This component implements pure pull-to-refresh logic and you can use it for developing your own pull-to-refresh animations
Stars: ✭ 1,150 (+693.1%)
Mutual labels:  yalantis
Segmentio
Animated top/bottom segmented control written in Swift.
Stars: ✭ 2,310 (+1493.1%)
Mutual labels:  yalantis
Starwars.ios
This component implements transition animation to crumble view-controller into tiny pieces.
Stars: ✭ 3,685 (+2441.38%)
Mutual labels:  yalantis
Fasteasymapping
A tool for fast serializing & deserializing of JSON
Stars: ✭ 556 (+283.45%)
Mutual labels:  yalantis
Pulltomakesoup
Custom animated pull-to-refresh that can be easily added to UIScrollView
Stars: ✭ 1,928 (+1229.66%)
Mutual labels:  yalantis
Colormatchtabs
This is a Review posting app that let user find interesting places near them
Stars: ✭ 1,341 (+824.83%)
Mutual labels:  yalantis
Yalfield
Custom Field component with validation for creating easier form-like UI from interface builder.
Stars: ✭ 476 (+228.28%)
Mutual labels:  yalantis
Preloader.ophiuchus
Custom Label to apply animations on whole text or letters.
Stars: ✭ 880 (+506.9%)
Mutual labels:  yalantis
Cloudkit Demo.swift
Stars: ✭ 244 (+68.28%)
Mutual labels:  yalantis
Guillotinemenu
Our Guillotine Menu Transitioning Animation implemented in Swift reminds a bit of a notorious killing machine.
Stars: ✭ 2,908 (+1905.52%)
Mutual labels:  yalantis
Eatfit
Eat fit is a component for attractive data representation inspired by Google Fit
Stars: ✭ 657 (+353.1%)
Mutual labels:  yalantis
Pull To Refresh.rentals Ios
This project aims to provide a simple and customizable pull to refresh implementation. Made in Yalantis
Stars: ✭ 2,171 (+1397.24%)
Mutual labels:  yalantis
Pixpic
PixPic, a Photo Editing App
Stars: ✭ 1,261 (+769.66%)
Mutual labels:  yalantis
Fittrack
Concept of a fitness app.
Stars: ✭ 165 (+13.79%)
Mutual labels:  yalantis
Koloda
KolodaView is a class designed to simplify the implementation of Tinder like cards on iOS.
Stars: ✭ 4,998 (+3346.9%)
Mutual labels:  yalantis
Cloudkit Demo.objective C
Stars: ✭ 133 (-8.28%)
Mutual labels:  yalantis
Appearancenavigationcontroller
Example with advanced configuration of the navigation controller's appearance
Stars: ✭ 91 (-37.24%)
Mutual labels:  yalantis
Forceblur
ForceBlur Animation for iOS Messaging Apps
Stars: ✭ 666 (+359.31%)
Mutual labels:  yalantis

iOS Guidelines

Project Structure

  • Organized .xcodeproj: files are grouped by layers (Presentation, Domain/Model, Infrastructure, etc), responsibilities (UI, Model, Logic, Vendor, etc), roles, etc. No flat structure allowed
  • Organized project folder: desirable but not required to keep file structure in sync with .xcodeproj
  • One .m / .swift == One class. No extra classes allowed
  • Localization is required even for the case, when you have only one language. Therefore adding extra language won't cause any difficulty in future
  • Images and other resources (.plist) should be grouped as well (i.e. $SRCROOT/Resources/Images/Common/, $SRCROOT/Resource/Assets/)

File Structure (.m)

  • Structure
imports

related constants

class extension

@implementation
- dealloc
- init methods
- other
@end
  • Method sections should be separated by #pragma mark - $sectionName

Braces, Asterisk

  • Curly braces are opened on the same line with code, closed - on a new line. For short blocks / closures a single line can be used
  • Asterisk placed near the name Type *var = ...;
  • Every code block should be wrapped by {}:
if (statement) {
    NSLog(@"%@", var);
}

The only exception is a short statement and an immediate return in the beginning:

- (void)performSomeTask {
    if (!user.hasToken) return;
    ...
}

Spaces, Formatting

General

  • Tab consists of 4 spaces
  • Max symbols in a row: 120
  • Use space after if, while, for and similar:
if (pointer != someOtherPointer)

CGFloat result = width * height * 2.f;

BOOL contentExists = self.content.length > 0;

for (int i = 0; i < x; i++) { ... }
  • Alignment: do not align code as ASCII-art.
  • Separate logical code blocks with 1 line wrap. Random number of \n is not allowed

Variable declaration

  • Between Type & Protocol there are no spaces: id<NSObject> object = ...;
  • Between var and casting parentheses there are no spaces: ClassType *a = (ClassType *)b;, ScalarType a = (ScalarType)b;

Class Declaration

  • If listing protocols goes beyond 120 characters, place each on a separate line:
@interface SCHCategoryViewController : UIViewController <UITableViewDelegate> 

@interface SCHCategoryViewController : UIViewController <
    UITableViewDelegate, 
    UITableViewDataSource, 
    SCHSyncronizationDelegate
>

Method Declaration

  • Use a single space between +/- and a returned type. Any additional spaces in arguments list are not allowed: - (void)doSomethingWithString:(NSString *)string flag:(BOOL)flag;
  • If the method goes beyond 120+10 characters, place each argument on a separate line, align by colon:
- (void)doSomethingWithString:(NSString *)string
                         rect:(CGRect)rectangle
                       length:(NSUInteger)length;

Method Invocation

  • Method invocation should use the same formatting as for declaration

Function Declaration

  • No space symbol between name and arguments parentheses
  • If the method goes beyond 120+10 characters, parentheses should be placed the same way, as opening/closing braces. Place each argument on a separate line aligned by 1 tab:
void * LongLongLongFunction(
    id firstArgument, 
    id secondArgument,
    id *outArgument,
    int other
)

NSAssert(
    [controller conformsToProtocol:@protocol(EParticipantSelection)],
    @"Controller %@ should confrom to protocol",
    NSStringFromProtocol(@protocol(EParticipantSelection))
);

Access specifiers & ivars

  • @public, @private, @protected should be aligned by 1 tab:
@interface MyClass : NSObject {
    @private
    id _privateIvar;

    @protected
    id _protectedIvar;
}
  • Access specifiers should be declared explicitly

Property Declaration

  • Between @property and opening parentheses 1 space symbol should be used
  • Parameters ordering: atomic/nonatomic, memory policy, access specified (readonly/readwrite), setter declaration, getter declaration: @property (nonatomic, copy, readonly, getter=customGetter) NSString *value;

Protocol Declaration

  • @required and @optional aligned to the line beginning

Blocks / Closures Declaration

  • Code inside block / closure aligned by 1 tab
  • Opening and closing braces should be aligned by the first symbol of declaration:
dipatch_async(dispatch_get_main_queue(), ^{
    // your code here
});

NSArray *contentArray = nil;
[contentArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){
     // your code here
}];

[UIView animateWithDuration:0.3 animations:^{
    // your code here
} completion:^(BOOL finished){
     // your code here
}];
  • There is no space between ^ and return type / arguments: ^(id response){} ^NSUInteger * (id response){}

Naming

In general we're using Apple Coding Guidelines for Cocoa with several highlights:

  • Three-letters prefix is REQUIRED
  • Methods for the non-project class categories should be prefixed by lowercasePrefix_: - (void)sch_performTask:(id)arg

Constants

  • Magical numbers are not allowed - constants should be used instead. Exception: constant value, used in local one place with descriptive name
  • No "raw" strings. Exception: the same as for the magical numbers
  • Desirable to use extern keyword:
// SCHNotifier.h
OBJC_EXTERN NSString * const SCHNotifierDidChangeStateNotification;
OBJC_EXTERN const CGFloat SCHDefaultAnimationDuration;

// SCHNotifier.m

NSString * const SCHNotifierDidChangeStateNotification = @"com.project.notifier.stateDidChange";
const CGFloat SCHDefaultAnimationDuration = 0.33;

Required / recommended best practices

Types Declaration / Usage

  • Use typedef for blocks declaration and custom enums / scalar types
  • Use NSInteger, NSTimeInterval, CGFloat, etc over plain types. Therefore it is easier to migrate to the 64-bits

Forward Declaration

Use forward declaration whenever possible

Ivars

@public ivars not allowed

Properties

  • Use copy specifier in case mutability leads to unexpected behaviour (i.e. when NSMutableString passed as NSString and mutated outside of the class)
  • Use readonly for public properties whenever possible to prevent unexpected class usage (i.e. outlet assigned from client code, etc)
  • (iOS only) Use nonatomic whenever possible to speedup code execution
  • Desirable to access underlying property's ivar only in init/setter/getter
  • Use of @property solely to create _ivar is not recommended and should be prohibited

Exceptions handling

Use exceptions only where it is required. Desirable to use NSError ** and / or return result status (i.e. Success, Fail)

Protocols

  • Delegate methods should always pass sender argument:
@protocol CustomClassDelegate <NSObject>

- (NSInteger)someDelegateMethod:(CustomClass *)customClass;
- (void)customClass:(CustomClass *)customClass didSelectRowAtIndexPath:(NSIndexPath *)indexPath;

@end
  • Protocol support for properties / vars should be declared explicitly: id<Protocol> instance = ...;, @property (nonatomic, weak) id<Protocol> delegate;

Boolean statements

  • Desirable to use implicit equality check: if (bar && baz && quux)

Preprocessor usage

  • Prefer c-functions / constants / methods over #define

AppDelegate

Keep your AppDelegate as clean as possible. Any logic, not related to AppDelegate (database seeding, networking, etc) is not allowed

Clean .pch

Group required #defines, constants to a separate header (SCHConstants.h, SCHDefines.h). Garbage in .pch is not allowed

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].