04Aug

Access Control in Swift 3

If you are doing programming for a while, you have often heard of some weird keywords like open,public,internal,file-private and private.

 

Before we dive into those keywords, we must know one important thing "Module".
module is just a bundle of code. single Xcode project/framework/bundle is considered as a single module.

 

Even UIKit is considered as one module. For example, when you try to interact with UIComponents such as UITableView, UIButton, UIViewController, and so on, you have to import the UIKit library/module on the top.

Example:

import UIKit

class PrimaryViewController:UIViewController{}

 

So, we are using code written in UIKit.By default your xcode project doesn't contain all of those swift/Obj-C files, so you must import.

 

if you want to import someones code probably you might have used cocoa pods to download the files but you can use those classes within framework by importing module/framework.

Like:

import CanarysRecords

Let's see what apple says about Module:

A module is a single unit of code distribution — a framework or application that is built and shipped as a single unit and that can be imported by another module with Swift’s import keyword.

I think its enough of introduction about Module.

Now its time to get into some real world scenario "Access Control".

 

Why Access Control?
well, main idea behind access control is to stop mess arround with what we have just imported.
For Example, UIKit Engineers at Apple don't want ios developers to modify some of theirs classes,methods,variables and functions.so this restrictions we can impose with the help of Access Control.

 

Stil in confusion?
lets see this way, Imagine you gave your Mac to your 7 year old son to use.But your kid begins to open up the parts of entire Mac and try to "Customize" things.Same way, Apple engineers don't want developers to mess arround with their code.So they have created some sort of restrictions/barrier to block us from having to their source code.That's the reason it's called, "Access Control".

 

Like i mentoned above we have 5 types of Access Control in swift. Let's begin with one by one,

 

1.Open
Open is a Least Control.
An open class is accessible and subclassable outside of the defining module. An open class member is accessible and overridable outside of the defining module.

For Example:

helloTableView:UITableView{}

Great, but how is this possible that we can subclass?To get the solution, You can option+Click on UITableview class
here what you can see

open class UITableView : UIScrollView, NSCoding, UIDataSourceTranslating {} 


so,Open is to provide you access from defining module UIKit and even you can subclass as shown above helloTableView.

 

2.Public
Public is almost similar to Open but not subclassable outside of the defining module.A public class member is accessible but not overridable outside of the defining module.

For Example:

public protocol UITableViewDelegate : NSObjectProtocol, UIScrollViewDelegate {}

 

From your app bundle/Xcode project you have access to UITableView. But we can't subclass UITableViewDelegate in our own.
So it can only be overridden by subclasses within the module where they are defined.

 

3.Internal/Default
Well all veriables,class and functions are internal by default.Those that are marked with internal can be used only within any source files from their defining module but not in any source file outside of that module.

whatever the internal functions that are created by apple developers can not be accessed by other ios developers.

For Example: 

internal func demofunction(){
    print("accessible")
}

demofunction can't accessed outside the defining module even we import that module.


4.File-Private
This access specifier can be used only if you want your function/class/variables to be used within one single swift file.

Below code will give you a clear picture of difference between File-Private & Private (Private access specifier we are going to look in a short time).

For Example:

In demo.swift file

class A {
    private func foo() {}
    fileprivate func bar() {}

    func baz() {
        foo()
        bar()
    }
}

extension A {
    func test() {
        foo() // error: use of unresolved identifier 'foo'
        bar()
    }
}

let a = A()
a.foo() // error: 'foo' is inaccessible due to 'private' protection level
a.bar()

The private foo method is accessible only within the scope of the class A { ... } definition. It is not even accessible from an extension to the type 

The file-private bar method is accessible from the same source file.

 

5.Private
Finaly, There is no way for you to use/access when you “escape” out of classes, functions, or methods achived by Private.

Example:

Demo.swift

class Demo{

    private var checkME = "Got You"
}

Demo() //No error
Demo().checkME ///Error

 

That's it. I hope You've fully understood the concepts of access specifiers. so no more wories again if you see open,public,internal,file-private and private keywords.

Related

Swift Closures

In this blog post we will learn what is a closure, it's syntax and types of closures in Swift with e...

Read More >

Swift Mapping and Flat Mapping

In this blog post, I will introduce some of useful tips and techniques of using swift mapping and fl...

Read More >

How to handle the exceptions using recovery scenario manager in QTP?

VB script Error HandlingDurning run time, if QTP encounters any erorr then it will display the error...

Read More >

Creating Apps Using Phonegap Framework in IOS

Creating apps for different operating system is not a reliability so for reducing developr work for ...

Read More >

Memory Management in iOS

Memory Management iOS In this blog we will walk through very important thing which all iOS developer...

Read More >

Implementing iOS Setting Bundle

 iOS Setting Bundle:-Actually sometimes we need to interact our app i.e giving some input value...

Read More >

Base64 encoding in Objective c

When we have some binary data that need to send across network, we generally don't do it by just...

Read More >

Wireless Ad-Hoc distribution for iOS apps

Creating Ad-Hoc is an important part of iOS app development because it helps us in testing the app d...

Read More >

iOS qrcode generator

Have you heard of QR Codes yet? Here is a quick introduction:- QR is short for Quick Response . It i...

Read More >

How to Create a Provisioning profile for iOS

To Run an app on iOS device,you must have a Provisioning Profile installed on your device. ...

Read More >

Share

Post a Comment

  • Recent
  • Popular
  • Tag
Monthly Archive
Subscribe
Name

Contact Us
  • *
  • *