@class DataViewController;
is for
-(DataViewController *)viewControllerAtIndex:(NSUInteger)index 
                                  storyboard:(UIStoryboard *)storyboard;
@class is a forward declaration that tells the compiler to be a little forgiving to this method declaration that is meant to return a DataViewController object, and defer the handling to the implementation part.
You will eventually need #import "DataViewController.h" in ModelController.m.
Well... you could put #import "DataViewController.h" but... if DataViewController.h itself has an #import "ModelController.h" statement then the compiler will go in a circular import loop.
As for:
Why #import "DataViewController.h" in ModelController.m is not enough ?
- You're publicly declaring a method -viewControllerAtIndex:storyboard:inModelController.h.
- This tells classes importing ModelControllerthat it provides such a method.
 
- This method returns a DataViewControllerobject and since the possibility ofDataViewController.himportingModelController.hexists
- You need @class DataViewController;inModelController.h
 
- Since @classis only a forward declaration, you need#import "DataViewController.h"inModelController.m
If... the method is used within ModelController class only then you need not declare the method in the .h and thereby dropping the need for the @class DataViewController; statement.
Also, I like this generic answer on @class vs. #import