A regular expression (or RE) specifies a set of strings that matches it; the functions in this module let you check if a particular string matches a given regular expression (or if a given regular expression matches a particular string, which comes down to the same thing). Blah blah blah.

Again, documentation first
https://docs.python.org/3/library/re.html
as always

1
import re

You cannot match a Unicode string with a byte pattern or vice-versa.

The special characters in RE
tl;ra (Too long; Read anyway) or maybe you should read the documentation directly.

‘.’
(Dot.) In the default mode, this matches any character except a newline. If the DOTALL flag has been specified, this matches any character including a newline.

‘^’
(Caret.) Matches the start of the string, and in MULTILINE mode also matches immediately after each newline.

‘$’
Matches the end of the string or just before the newline at the end of the string, and in MULTILINE mode also matches before a newline.


Causes the resulting RE to match 0 or more repetitions of the preceding RE, as many repetitions as are possible. ab
will match ‘a’, ‘ab’, or ‘a’ followed by any number of ‘b’s.

‘+’
Causes the resulting RE to match 1 or more repetitions of the preceding RE. ab+ will match ‘a’ followed by any non-zero number of ‘b’s; it will not match just ‘a’.

‘?’
Causes the resulting RE to match 0 or 1 repetitions of the preceding RE. ab? will match either ‘a’ or ‘ab’.

?, +?, ??
The ‘
‘, ‘+’, and ‘?’ qualifiers are all greedy; they match as much text as possible. Sometimes this behaviour isn’t desired; if the RE <.*> is matched against b , it will match the entire string, and not just . Adding ? after the qualifier makes it perform the match in non-greedy or minimal fashion; as few characters as possible will be matched. Using the RE <.*?> will match only .

{m}
Specifies that exactly m copies of the previous RE should be matched; fewer matches cause the entire RE not to match. For example, a{6} will match exactly six ‘a’ characters, but not five.

{m,n}
Causes the resulting RE to match from m to n repetitions of the preceding RE, attempting to match as many repetitions as possible.

{m,n}?
Causes the resulting RE to match from m to n repetitions of the preceding RE, attempting to match as few repetitions as possible.

‘'
Either escapes special characters (permitting you to match characters like ‘*’, ‘?’, and so forth), or signals a special sequence

[]
Used to indicate a set of characters.

‘|’
A|B, where A and B can be arbitrary REs, creates a regular expression that will match either A or B.

(…)
Matches whatever regular expression is inside the parentheses, and indicates the start and end of a group

(?…)
This is an extension notation (a ‘?’ following a ‘(‘ is not meaningful otherwise). The first character after the ‘?’ determines what the meaning and further syntax of the construct is.

(?aiLmsux)
(One or more letters from the set ‘a’, ‘i’, ‘L’, ‘m’, ‘s’, ‘u’, ‘x’.) The group matches the empty string; the letters set the corresponding flags: re.A (ASCII-only matching), re.I (ignore case), re.L (locale dependent), re.M (multi-line), re.S (dot matches all), and re.X (verbose), for the entire regular expression.

(?:…)
A non-capturing version of regular parentheses. Matches whatever regular expression is inside the parentheses, but the substring matched by the group cannot be retrieved after performing a match or referenced later in the pattern.

(?imsx-imsx:…)
(Zero or more letters from the set ‘i’, ‘m’, ‘s’, ‘x’, optionally followed by ‘-‘ followed by one or more letters from the same set.) The letters set or removes the corresponding flags: re.I (ignore case), re.M (multi-line), re.S (dot matches all), and re.X (verbose), for the part of the expression. (The flags are described in Module Contents.)

(?P…)
Similar to regular parentheses, but the substring matched by the group is accessible via the symbolic group name name. If the pattern is (?P[‘“]).*?(?P=quote) (i.e. matching a string quoted with either single or double quotes)

(?P=name)
A backreference to a named group; it matches whatever text was matched by the earlier group named name.

(?#…)
A comment; the contents of the parentheses are simply ignored.

(?=…)
Matches if … matches next, but doesn’t consume any of the string. This is called a lookahead assertion. For example, Isaac (?=Asimov) will match ‘Isaac ‘ only if it’s followed by ‘Asimov’.

(?!…)
Matches if … doesn’t match next. This is a negative lookahead assertion. For example, Isaac (?!Asimov) will match ‘Isaac ‘ only if it’s not followed by ‘Asimov’.

(?<=…)
Matches if the current position in the string is preceded by a match for … that ends at the current position. This is called a positive lookbehind assertion. (?<=abc)def will find a match in abcdef, since the lookbehind will back up 3 characters and check if the contained pattern matches. The contained pattern must only match strings of some fixed length, meaning that abc or a|b are allowed, but a* and a{3,4} are not.

(?<!…)
Matches if the current position in the string is not preceded by a match for …

(?(id/name)yes-pattern|no-pattern)
Will try to match with yes-pattern if the group with given id or name exists, and with no-pattern if it doesn’t. no-pattern is optional and can be omitted. For example, (<)?(\w+@\w+(?:.\w+)+)(?(1)>|$) is a poor email matching pattern, which will match with ‘
user@host.com‘ as well as ‘user@host.com‘, but not with ‘<user@host.com‘ nor ‘user@host.com>’.

\number
Matches the contents of the group of the same number. Groups are numbered starting from 1. For example, (.+) \1 matches ‘the the’ or ‘55 55’, but not ‘thethe’ (note the space after the group).

\A
Matches only at the start of the string.

\b
Matches the empty string, but only at the beginning or end of a word.

\B
Matches the empty string, but only when it is not at the beginning or end of a word. This means that r’py\B’ matches ‘python’, ‘py3’, ‘py2’, but not ‘py’, ‘py.’, or ‘py!’.

\d
For Unicode (str) patterns:
Matches any Unicode decimal digit (that is, any character in Unicode character category [Nd]). This includes [0-9], and also many other digit characters. If the ASCII flag is used only [0-9] is matched (but the flag affects the entire regular expression, so in such cases using an explicit [0-9] may be a better choice).
For 8-bit (bytes) patterns:
Matches any decimal digit; this is equivalent to [0-9].

\D
Matches any character which is not a Unicode decimal digit. This is the opposite of \d. If the ASCII flag is used this becomes the equivalent of [^0-9] (but the flag affects the entire regular expression, so in such cases using an explicit [^0-9] may be a better choice).

\s
Matches Unicode whitespace characters

\S
Matches any character which is not a Unicode whitespace character.

\w
Matches Unicode word characters

\W
Matches any character which is not a Unicode word character.

\Z
Matches only at the end of the string.

OK, let’s move on to Module Contents

1
re.compile(pattern, flags=0)

Compile a regular expression pattern into a regular expression object, which can be used for matching using its match() and search() methods

1
2
prog = re.compile(pattern)
result = prog.match(string)

is equivalent to

1
result = re.match(pattern, string)

but using re.compile() and saving the resulting regular expression object for reuse is more efficient when the expression will be used several times in a single program.

re.A
re.ASCII

re.DEBUG

re.I
re.IGNORECASE

re.L
re.LOCALE

re.M
re.MULTILINE

re.S
re.DOTALL

re.X
re.VERBOSE
This flag allows you to write regular expressions that look nicer and are more readable by allowing you to visually separate logical sections of the pattern and add comments. Whitespace within the pattern is ignored, except when in a character class or when preceded by an unescaped backslash. When a line contains a # that is not in a character class and is not preceded by an unescaped backslash, all characters from the leftmost such # through the end of the line are ignored.

This means that the two following regular expression objects that match a decimal number are functionally equal:

1
2
3
4
5
6
a = re.compile(r"""\d +  # the integral part
\. # the decimal point
\d * # some fractional digits""", re.X)
b = re.compile(r"\d+\.\d*")

re.search(pattern, string, flags=0)

Scan through string looking for the first location where the regular expression pattern produces a match, and return a corresponding match object.

1
re.match(pattern, string, flags=0)

If zero or more characters at the beginning (be careful) of string match the regular expression pattern, return a corresponding match object.

1
re.fullmatch(pattern, string, flags=0)

If the whole string matches the regular expression pattern, return a corresponding match object.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
re.split(pattern, string, maxsplit=0, flags=0)
# Split string by the occurrences of pattern.
re.split('\W+', 'Words, words, words.')
# ['Words', 'words', 'words', '']
re.split('(\W+)', 'Words, words, words.')
# ['Words', ', ', 'words', ', ', 'words', '.', '']
re.split('\W+', 'Words, words, words.', 1)
# ['Words', 'words, words.']
re.split('[a-f]+', '0a3B9', flags=re.IGNORECASE)
# ['0', '3', '9']
re.split('(\W+)', '...words, words...')
# ['', '...', 'words', ', ', 'words', '...', '']

re.findall(pattern, string, flags=0)
# Return all non-overlapping matches of pattern in string, as a list of strings.

re.finditer(pattern, string, flags=0)
# Return an iterator yielding match objects over all non-overlapping matches for the RE pattern in string.

re.sub(pattern, repl, string, count=0, flags=0)

Return the string obtained by replacing the leftmost non-overlapping occurrences of pattern in string by the replacement repl.

1
2
3
4
5
6
7
8
9
10
m = re.match(r"(\w+) (\w+)", "Isaac Newton, physicist")
m.group(0) # The entire match 'Isaac Newton'
m.group(1) # The first parenthesized subgroup. 'Isaac'
m.group(2) # The second parenthesized subgroup. 'Newton'
m.group(1, 2) # Multiple arguments give us a tuple. ('Isaac', 'Newton')

email = "tony@tiremove_thisger.net"
m = re.search("remove_this", email)
email[:m.start()] + email[m.end():]
# 'tony@tiger.net'

Regular Expression Examples in standard docs

1
2
3
4
def displaymatch(match):
if match is None:
return None
return '<Match: %r, groups=%r>' % (match.group(), match.groups())

Suppose you are writing a poker program where a player’s hand is represented as a 5-character string with each character representing a card, “a” for ace, “k” for king, “q” for queen, “j” for jack, “t” for 10, and “2” through “9” representing the card with that value.

To see if a given string is a valid hand, one could do the following:

1
2
3
4
5
valid = re.compile(r"^[a2-9tjqk]{5}$")
displaymatch(valid.match("akt5q")) # Valid. "<Match: 'akt5q', groups=()>"
displaymatch(valid.match("akt5e")) # Invalid.
displaymatch(valid.match("akt")) # Invalid.
displaymatch(valid.match("727ak")) # Valid. "<Match: '727ak', groups=()>"

That last hand, “727ak”, contained a pair, or two of the same valued cards. To match this with a regular expression, one could use backreferences as such:

1
2
3
4
pair = re.compile(r".*(.).*\1")
displaymatch(pair.match("717ak")) # Pair of 7s. "<Match: '717', groups=('7',)>"
displaymatch(pair.match("718ak")) # No pairs.
displaymatch(pair.match("354aa")) # Pair of aces. "<Match: '354aa', groups=('a',)>"

To find out what card the pair consists of, one could use the group() method of the match object in the following manner:

1
2
3
4
5
6
7
8
9
pair.match("717ak").group(1) # '7'
# Error because re.match() returns None, which doesn't have a group() method:
pair.match("718ak").group(1)
Traceback (most recent call last):
File "<pyshell#23>", line 1, in <module>
re.match(r".*(.).*\1", "718ak").group(1)
AttributeError: 'NoneType' object has no attribute 'group'

pair.match("354aa").group(1) # 'a'

search() vs. match()

of course you can look up on stackoverflow: re.match() checks for a match only at the beginning of the string, while re.search() checks for a match anywhere in the string (this is what Perl does by default).

1
2
text = "He was carefully disguised but captured quickly by police."
re.findall(r"\w+ly", text) # ['carefully', 'quickly']

Writing a Tokenizer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import collections
import re

Token = collections.namedtuple('Token', ['typ', 'value', 'line', 'column'])

def tokenize(code):
keywords = {'IF', 'THEN', 'ENDIF', 'FOR', 'NEXT', 'GOSUB', 'RETURN'}
token_specification = [
('NUMBER', r'\d+(\.\d*)?'), # Integer or decimal number
('ASSIGN', r':='), # Assignment operator
('END', r';'), # Statement terminator
('ID', r'[A-Za-z]+'), # Identifiers
('OP', r'[+\-*/]'), # Arithmetic operators
('NEWLINE', r'\n'), # Line endings
('SKIP', r'[ \t]+'), # Skip over spaces and tabs
('MISMATCH',r'.'), # Any other character
]
tok_regex = '|'.join('(?P<%s>%s)' % pair for pair in token_specification)
line_num = 1
line_start = 0
for mo in re.finditer(tok_regex, code):
kind = mo.lastgroup
value = mo.group(kind)
if kind == 'NEWLINE':
line_start = mo.end()
line_num += 1
elif kind == 'SKIP':
pass
elif kind == 'MISMATCH':
raise RuntimeError(f'{value!r} unexpected on line {line_num}')
else:
if kind == 'ID' and value in keywords:
kind = value
column = mo.start() - line_start
yield Token(kind, value, line_num, column)

statements = '''
IF quantity THEN
total := total + price * quantity;
tax := price * 0.05;
ENDIF;
'''

for token in tokenize(statements):
print(token)

The tokenizer produces the following output:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Token(typ='IF', value='IF', line=2, column=4)
Token(typ='ID', value='quantity', line=2, column=7)
Token(typ='THEN', value='THEN', line=2, column=16)
Token(typ='ID', value='total', line=3, column=8)
Token(typ='ASSIGN', value=':=', line=3, column=14)
Token(typ='ID', value='total', line=3, column=17)
Token(typ='OP', value='+', line=3, column=23)
Token(typ='ID', value='price', line=3, column=25)
Token(typ='OP', value='*', line=3, column=31)
Token(typ='ID', value='quantity', line=3, column=33)
Token(typ='END', value=';', line=3, column=41)
Token(typ='ID', value='tax', line=4, column=8)
Token(typ='ASSIGN', value=':=', line=4, column=12)
Token(typ='ID', value='price', line=4, column=15)
Token(typ='OP', value='*', line=4, column=21)
Token(typ='NUMBER', value='0.05', line=4, column=23)
Token(typ='END', value=';', line=4, column=27)
Token(typ='ENDIF', value='ENDIF', line=5, column=4)
Token(typ='END', value=';', line=5, column=9)

I know, I know it’s a headache to read these, try PyMOTW-3 instead if you want
https://pymotw.com/3/re/index.html

Out there is an alternative regular expression module, to replace re, called regex.
https://pypi.python.org/pypi/regex/

And read this:
10 Tips to Get More out of Your Regexes
http://pybit.es/mastering-regex.html

First of all, in Python 3

1
import random

You would find the documentation on page of
https://docs.python.org/3/library/random.html
in which it said that almost all module functions depend on the basic function random(), which generates a random float uniformly in the semi-open range [0.0, 1.0).

Normally I would not talk about the deeper side of the module such as the core generator. However in this case, you have to know that Python uses the Mersenne Twister as the core generator.

It produces 53-bit precision floats and has a period of 2**19937-1. The underlying implementation in C is both fast and threadsafe. The Mersenne Twister is one of the most extensively tested random number generators in existence. However, being completely deterministic, it is not suitable for all purposes, and is completely unsuitable for cryptographic purposes.

I say it again that random Module is unsuitable for cryptographic purposes. Other than that you could use it all the time.

1
2
3
4
5
6
7
8
9
10
11
12
random.random() # 0.01658182124355423
random.uniform(1.5, 100.5) # 17.133710707896064
random.seed(1) # seeding, otherwise, the current time is used
random.randint(1, 100) # Random Integers
random.randint(-5, 5)
random.randint(a, b) # Return a random integer N such that a <= N <= b
random.randrange(0, 101, 5)
random.choice('abc')
random.choices(['red', 'black', 'green'], [18, 18, 2], k=6) # ['red', 'green', 'black', 'black', 'red', 'black']
words =['a','b','c','d']
random.shuffle(words) # ['d', 'b', 'a', 'c']
random.sample('abcdefg',2) # ['f', 'a']

By the way, for security or cryptographic uses, there is a module called secrets.

According to 16.3. time — Time access and conversions
https://docs.python.org/3/library/time.html

1
This module provides various time-related functions. 

Or you can say in this module there are

1
Functions for manipulating clock time.

as in the PYMOTW-3
https://pymotw.com/3/time/index.html

I am not going to list every function available in the ‘time’ module, only the core functions such as time(), etc.

1
2
3
import time

time.time()

You would see number of seconds since the start of the “epoch” as a floating point value, e.g. 1491220050.174642.

1
2
3
4
5
6
7
8
time.ctime() # 'Mon Apr  3 19:49:02 2017'
time.ctime(15) # 'Thu Jan 1 08:00:15 1970'
time.ctime(1) # 'Thu Jan 1 08:00:01 1970'
time.ctime(time.time()+15) # 'Mon Apr 3 19:52:10 2017'

start = time.monotonic()
time.sleep(15.5) # sleep for at least 15.5 seconds, see PEP 475
end = time.monotonic()

Only the difference between the results of consecutive calls is valid. The same applies to time.perf_counter() and time.process_time()

1
time.gmtime()

time.struct_time(tm_year=2017, tm_mon=4, tm_mday=3, tm_hour=12, tm_min=3, tm_sec=33, tm_wday=0, tm_yday=93, tm_isdst=0)

1
2
3
4
time.gmtime().tm_year # 2017
time.gmtime()[0] # 2017

time.perf_counter()

Return the value (in fractional seconds) of a performance counter, i.e. a clock with the highest available resolution to measure a short duration. It does include time elapsed during sleep and is system-wide.

1
time.process_time()

Return the value (in fractional seconds) of the sum of the system and user CPU time of the current process. It does not include time elapsed during sleep. It is process-wide by definition.

The above should be enough for now.

Life is short, I use Python.

>>> import this

The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!```

Yes there are desperate times, maybe because things get worse before they get better. Anyway, please use Cocoapods in your projects.

Install CocoaPods:

1
sudo gem install cocoapods

It would not work if you are in China, try:

1
2
gem sources --add https://ruby.taobao.org/ --remove https://rubygems.org/
gem sources -l

Try install CocoaPods again:

1
sudo gem install cocoapods

Up and running, next setup the Pod:

1
pod setup

Navigate to the directory containing your project:

1
2
cd someDirectory
pod init

Open the Podfile using command (or edit it using any text editor):

1
open -a Xcode Podfile

Modify Podfile (just for example):

1
2
3
4
5
6
7
platform :ios, ‘8.0’
use_frameworks!
 
target 'AlamofireSwiftyJSONSample' do
    pod 'Alamofire'
    pod 'SwiftyJSON'
end

Save it and Go back to terminal (still at your project directory):

1
pod install

From now on you have to use the .xcworkspace of your project. And before starting your work, remember to include these framework in the General, Linked Frameworks and Libraries.

You could find a better tutorial by googling.

To use the TouchID in your app, first include LocalAuthentication.framework and then add some code. The reason for implementing dispatch_async is that it somehow speeds up the UI updating process.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import UIKit
import LocalAuthentication

class ViewController: UIViewController {

@IBOutlet weak var statusLabel: UILabel!

@IBAction func authAction(sender: AnyObject) {
authAction()
}

override func viewDidLoad() {
super.viewDidLoad()
}

func authAction() {

let laContext = LAContext()
var authError : NSError?
let authReason = "Unlock the app"

if laContext.canEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, error: &authError) {
laContext.evaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, localizedReason: authReason, reply: { (success, error) -> Void in
if success {
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.successForLogin()
})
} else {
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.failedForLogin()
})
}
})
}
}

func successForLogin() {
statusLabel.text = "Succeeded"
}

func failedForLogin() {
statusLabel.text = "Failed"
}

}

Define an UISwipeGestureRecognizer:

1
2
3
4
5
6
override func viewDidLoad() {
super.viewDidLoad()
var swipeRight = UISwipeGestureRecognizer(target: self, action: "swiped:")
swipeRight.direction = UISwipeGestureRecognizerDirection.Right
self.view.addGestureRecognizer(swipeRight)
}

Detailed actions are in the func:

1
2
3
4
5
6
7
8
9
10
func swiped(gesture: UISwipeGestureRecognizer) {  
if let swipeGesture = gesture as? UISwipeGestureRecognizer {
switch swipeGesture.direction {
case UISwipeGestureRecognizerDirection.Right:
print("right")
default:
break
}
}
}

To deal with the motion shake of iPhone:

1
2
3
4
5
override func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent?) {
if event?.subtype == UIEventSubtype.MotionShake {
print("The phone has been shaken.”)
}
}

For the apps that enable users to input something in a textfield, you should always keep an eye on the keyboard resign. Here are 3 of the most common ways to accomplish this goal.

No.1 To resign the first responder position of the keyboard in the buttom action so that press this bottom would also cause keyboard dismiss:

1
self.someTextField.resignFirstResponder()

No.2 To override the touchesBegan function so that if users touch outside the keyboard, the keyboard closes down:

1
2
3
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
self.view.endEditing(true)
}

No.3 To inherit UITextFieldDelegate for the current ViewController, then use textFieldShouldReturn function so that when users press return key of the keyboard, the keyboard resigns:

1
2
3
4
func textFieldShouldReturn(textField: UITextField) -> Bool {
someTextField.resignFirstResponder()
return true
}

Just a simple note for myself.

Tell them I love what I do and Im really good at it,

and Im dying for something big and beautiful and greater than me,

and I can live with that.

The tutorial recently published by Apple is called Start Developing iOS Apps (Swift). Link

Just a tip about this tutorial, I found the UI odd on iPhone 5s. Maybe Apple presumes you should have iPhone 6 at least by now.

To give you a glance of what this project looks like, I show you MealTableViewController.swift as follows.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
import UIKit

class MealTableViewController: UITableViewController {
// MARK: Properties

var meals = [Meal]()

override func viewDidLoad() {
super.viewDidLoad()

// Use the edit button item provided by the table view controller.
navigationItem.leftBarButtonItem = editButtonItem()

// Load any saved meals, otherwise load sample data.
if let savedMeals = loadMeals() {
meals += savedMeals
} else {
// Load the sample data.
loadSampleMeals()
}
}

func loadSampleMeals() {
let photo1 = UIImage(named: "meal1")!
let meal1 = Meal(name: "Caprese Salad", photo: photo1, rating: 4)!

let photo2 = UIImage(named: "meal2")!
let meal2 = Meal(name: "Chicken and Potatoes", photo: photo2, rating: 5)!

let photo3 = UIImage(named: "meal3")!
let meal3 = Meal(name: "Pasta with Meatballs", photo: photo3, rating: 3)!

meals += [meal1, meal2, meal3]
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}

// MARK: - Table view data source

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return meals.count
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
// Table view cells are reused and should be dequeued using a cell identifier.
let cellIdentifier = "MealTableViewCell"
let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! MealTableViewCell

// Fetches the appropriate meal for the data source layout.
let meal = meals[indexPath.row]

cell.nameLabel.text = meal.name
cell.photoImageView.image = meal.photo
cell.ratingControl.rating = meal.rating

return cell
}

// Override to support conditional editing of the table view.
override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
// Return false if you do not want the specified item to be editable.
return true
}


// Override to support editing the table view.
override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if editingStyle == .Delete {
// Delete the row from the data source
meals.removeAtIndex(indexPath.row)
saveMeals()
tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
} else if editingStyle == .Insert {
// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
}
}


/*
// Override to support rearranging the table view.
override func tableView(tableView: UITableView, moveRowAtIndexPath fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) {

}
*/

/*
// Override to support conditional rearranging of the table view.
override func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool {
// Return false if you do not want the item to be re-orderable.
return true
}
*/


// MARK: - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "ShowDetail" {
let mealDetailViewController = segue.destinationViewController as! MealViewController

// Get the cell that generated this segue.
if let selectedMealCell = sender as? MealTableViewCell {
let indexPath = tableView.indexPathForCell(selectedMealCell)!
let selectedMeal = meals[indexPath.row]
mealDetailViewController.meal = selectedMeal
}
}
else if segue.identifier == "AddItem" {
print("Adding new meal.")
}
}


@IBAction func unwindToMealList(sender: UIStoryboardSegue) {
if let sourceViewController = sender.sourceViewController as? MealViewController, meal = sourceViewController.meal {
if let selectedIndexPath = tableView.indexPathForSelectedRow {
// Update an existing meal.
meals[selectedIndexPath.row] = meal
tableView.reloadRowsAtIndexPaths([selectedIndexPath], withRowAnimation: .None)
} else {
// Add a new meal.
let newIndexPath = NSIndexPath(forRow: meals.count, inSection: 0)
meals.append(meal)
tableView.insertRowsAtIndexPaths([newIndexPath], withRowAnimation: .Bottom)
}
// Save the meals.
saveMeals()
}
}

// MARK: NSCoding

func saveMeals() {
let isSuccessfulSave = NSKeyedArchiver.archiveRootObject(meals, toFile: Meal.ArchiveURL.path!)
if !isSuccessfulSave {
print("Failed to save meals...")
}
}

func loadMeals() -> [Meal]? {
return NSKeyedUnarchiver.unarchiveObjectWithFile(Meal.ArchiveURL.path!) as? [Meal]
}
}

Generally speaking, this tutorial by Apple of 21 Oct 2015 is the best learning material so far in the market for beginners of iOS development. You have to check it out and learn all that piece by piece. At current moment it is most up-to-date and of course compatible with Swift 2.1. I spent last whole week on this and finally pull it off at this Saturday. Not because it is difficult, but simply I just dont have that amount of time to walk all the way through. It is sad when you have to focus your daily job on something you just dont enjoy. Hopefully the experience I gain would be useful eventually at some point of time, if you ask for comfort.

Another thing quite helpful is iOS and Swift Terminology. For the terms you will encounter, I paste the Glossary as below for easy reference.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
action
A piece of code that’s linked to an event that can occur in your app.

activity viewer
Part of the Xcode toolbar that displays messages about the build process and other information.

adaptive interface
A UI that automatically adjusts so that it looks good in the context of the available screen space.

adopt
To indicate that a class, structure, or enumeration conforms to a protocol.

application programming interface (API)
A set of functions, classes, protocols, and other components that define how pieces of software should interact with each other.

app delegate
An object in your app (specifically, an instance of the AppDelegate class) that creates the window where your app’s content is drawn and that provides a place to respond to state transitions within the app.

application object
An object in your app that’s responsible for managing the life cycle of the app, communicating with its delegate, the app delegate, during state transitions within the app.

argument
A value you pass in to a function, method, or initializer to satisfy one of its parameters.

array
A data type that stores multiple values of the same type in an ordered list.

Attributes inspector
An inspector that you use to customize visual attributes of a UI element in a storyboard.

asset catalog
A tool to manage assets like images that are used by your app as part of its UI.

assistant editor
In Xcode, a secondary editor window that appears side-by-side with your primary editor.

Auto Layout
A layout engine that helps lay out your UI based on the constraints you specify.

base class
A class that’s at the root of its class hierarchy, meaning that it has no superclass.

canvas
The background of a storyboard where you add and arrange UI elements.

class
A piece of code that describes the behavior and properties common to any particular type of object, essentially providing a blueprint for the object.

class hierarchy
A hierarchical representation of a class’s relationships to its superclass and subclasses.

closed range operator
An operator (...) that lets you create a range of numbers that includes both the lower and upper values.

Cocoa Touch
The set of Apple frameworks and technologies used to develop iOS apps.

code completion
A feature of Xcode that infers what you’re trying to type from context and provides suggestions that you can select.

completion handler
A closure that’s passed as a parameter to a method that calls the closure when it finishes executing.

comment
A piece of text in a source code file that doesn’t get compiled as part of the program but provides context or other useful information about individual pieces of code.

conditional statement
A control flow statement that checks whether a condition is true before executing a piece of code.

conform to
For a class, structure, or enumeration to satisfy the requirements of a protocol.

console
A tool for debugging and for logging information for debugging purposes.

constant
A value that’s initialized once and cannot change, indicated in Swift by the let keyword.

constraint
In Auto Layout, a rule that explains where one element should be located relative to another, what size it should be, or which of two elements should shrink first when something reduces the space available for each of them.

content view
A view object that’s located at the top of a view hierarchy, serving as a container for the subviews in its hierarchy.

control
A specialized type of view (specifically, an instance of the UIControl class or one of its subclasses) that responds to user input.

convenience initializer
A secondary initializer, which adds additional behavior or customization, but must eventually call through to a designated initializer.

data model
The representation or structure of data within an app.

data source
An object that manages the app’™s data model, providing a view object with the information it needs to display that data.

delegate
An object that acts on behalf of, or in coordination with, another object.

designated initializer
One of the primary initializers for a class; a convenience initializer within a class must ultimately call through to a designated initializer.

destination view controller
The view controller whose contents are displayed at the end of a segue.

downcast
To attempt to cast an object to one of its subclass types.

entry point
Where control enters a program or piece of code.

enumeration
A data type that defines a group of related values and enables you to work with those values in a type-safe way within your code.

event-driven programming
A category of programming in which the flow of the app is determined by events: system events and user actions.

extension
A capability to add functionality to an existing type.

failable initializer
An initializer that could return nil after initialization.

first responder
An object that is first to receive many kinds of app events, including key events, motion events, and action messages, among others.

fix-it
A suggested fix for a compiler error in Xcode.

forced type cast operator
An operator (as!) that attempts a downcast and force-unwraps the result.

force-unwrap operator
An operator (!) placed after an optional value to access its underlying value.

function
A reusable, named piece of code that can be referred to from many places in a program.

functions menu
In Xcode, a jump menu that lets you navigate directly to a specific declaration or section in a source code file.

gesture recognizer
An object that you attach to a view that allows the view to respond to actions the way a control does.

global
A constant, variable, or function defined at the top-level scope of a program.

half-open range operator
An operator (..<) that lets you create a range of numbers that includes the lower but not the upper value.

Identity inspector
An inspector that you use to edit properties of an object in a storyboard related to that object’s identity, such as what class the object belongs to.

identity operator
An operator (===) that tests whether two object references both refer to the same object instance.

immutable
A value that cannot be changed (or mutated) after it’s initialized, like a constant.

implement
To define the behavior of something in code.

implicitly unwrapped optional
An optional that can also be used like a nonoptional value, without the need to unwrap the optional value each time it is accessed, because it’s assumed to always have a value after that value is initially set.

inheritance
When a class is a subclass of another class, it gets all of its behavior (methods, properties, and other characteristics) from its superclass.

initializer
A method that handles the process of preparing an instance of a class, structure, or enumeration for use, which involves setting an initial value for its properties and performing any other required setup.

inspector pane
An area in Xcode that displays inspectors, such as the Attributes inspector, Identity inspector, and Size inspector.

instance
A specific occurrence of a class (that is, an object), structure, or enumeration.

integrated development environment (IDE)
A software application that provides a set of tools for software development.

Interface Builder
The graphical environment for building a UI in Xcode.

intrinsic content size
The minimum size needed to display all the content in a view without clipping or distorting that content.

iterate
To perform repeatedly.

library pane
An area in Xcode that displays one of the ready-to-use libraries of resources for your project, like the Object library.

local
A constant or variable defined only within a particular, limited scope, like a loop, conditional statement, or function.

loop
A control flow statement that executes the same piece of code multiple times.

method
A reusable, named piece of code that’s associated with a particular class, structure, or enumeration.

modal segue
A segue in which one view controller presents another view controller as its child, requiring a user to perform an operation on the presented controller before returning to the main flow of the app.

Model-View-Controller (MVC)
A pattern of app design in which view controllers serve as the communication pipeline between views and the data model.

mutable
A value that is able to be changed (or mutated) after it’s initialized, like a variable.

navigation controller
A specialized view controller subclass that manages transitions backward and forward through a series of view controllers.

navigation stack
The set of view controllers managed by a particular navigation controller.

nil
The absence of a value or no value.

nil coalescing operator
An operator (??) placed between two values, a ?? b, that unwraps an optional a if it contains a value, or returns a default value b if a is nil.

object
An instance of a class.

Object library
Part of the Xcode workspace window that shows a list of objects that can be added to a storyboard, including each object’s name, description, and visual representation.

optional
A value that contains either an underlying value or nil to indicate that the value is missing.

optional binding
The process of attempting to assign an optional value to a constant in a conditional statement to see if the optional contains an underlying value.

optional type cast operator
An operator (as?) that attempts a downcast and returns the result as an optional value.

outlet
A reference to an object in a storyboard from a source code file.

outline view
A pane in a storyboard that lets you see a hierarchical representation of the objects in your storyboard.

override
To replace an implementation of a method defined on a superclass.

parameter
An additional piece of information that must be passed into a function, method, or initializer when it’s called.

playground
A type of file in which you can change and play around with Swift code directly in Xcode and see the immediate results.

project navigator
Part of the Xcode workspace window that displays all the files in your project.

property
A piece of data encapsulated within a class, structure, or enumeration.

property observer
A piece of code that’s called every time a property’s value is set that’s used to observe and respond to changes in the property’s value.

protocol
A blueprint of methods, properties, and other requirements that suit a particular task or piece of functionality.

read-only
A value that can only be viewed (read) but never changed (written).

read-write
A value that can be both viewed (read) and changed (written).

resize handles
Small white squares that appear on a UI element’s borders when it’s selected so you can change its size on the canvas.

root view controller
The first item added to a navigation controller’s navigation stack, which is never popped off (removed from) the stack.

run loop
An event processing loop that you use to schedule work and coordinate the receipt of incoming events in your app.

runtime
The period during which a program is executing.

scene
A storyboard representation of a screen of content in your app.

scene dock
A bar that contains information related to a scene in a storyboard.

segue
A transition between two view controllers in a storyboard.

show segue
A segue that pushes new content on top of the current view controller stack.

Simulator
An app in Xcode that simulates the behavior and appearance of running an app on a device.

Size inspector
An inspector that you use to edit the size and position of a UI element in a storyboard.

source view controller
The view controller whose contents are displayed at the beginning of a segue.

storyboard
A file that contains a visual representation of the app’s UI (user interface), showing screens of content and the transitions between them, that you work on in Interface Builder.

storyboard entry point
The first scene that’s shown from a storyboard when an app starts.

string interpolation
The process of inserting string representations of constants, variables, literals, and expressions into longer strings.

structure
A data type that’s similar to a class, but doesn’t support inheritance and is passed by value instead of by reference.

subclass
A class that’s a child of another class (known as its superclass).

subview
A view that is enclosed by another view (known as its superview).

superclass
A class that’s a parent of another class (known as its subclass).

superview
A view that encloses another view (known as its subview).

Swift standard library
A set of data types and capabilities designed for Swift and baked into the language.

target
The object that receives the action message in the target-action pattern.

target-action
A design pattern in which one object sends a message to another object when a specific event occurs.

tuple
A grouping of values.

type casting
A way to check the type of an object, and to treat that object as if it’s a different superclass or subclass from somewhere else in its own class hierarchy.

type inference
The ability of the Swift compiler to determine the type of a value from context, without an explicit type declaration.

UIKit
A Cocoa Touch framework for working with the UI layer of an iOS app.

underscore
A representation of a wildcard in Swift (_).

unit test
A piece of code written specifically to test a small, self-contained piece of behavior in your app to make sure it behaves correctly.

unwrap
To extract an underlying value from an optional.

user interface (UI)
The layer of visual elements that lets a user interact with a piece of software.

utility area
An area in Xcode that displays the inspector pane and library pane.

unwind segue
A type of segue used to implement backward navigation.

variable
A value that can change after it’s been initialized, indicated in Swift by the var keyword.

view
An object that’s used to construct your UI and display content to the user.

view controller
An object that manages a set of views and coordinates the flow of information between the app’s data model and the views that display that data.

view hierarchy
A hierarchical representation of views relative to other views.

workspace window
The Xcode window, which you use to manage and navigate through the files and resources in your project.
0%