//
// main.swift
// MigrationPractices
//
// Created by Ricky Tsao on 2/3/17.
// Copyright © 2017 Epam. All rights reserved.
//
import Foundation
print("Hello, World!")
class Person {
// Implicit in the declaration of an optional with no value set,
// is the assignment to nil
private var firstName: String? //optional variables, mutable
private var lastName: String? //optional varaibles, mutable
let gender: String? //immutable, can only be initialized ONCE
//Initializers are called to create a new instance of a particular type. In its simplest form, an initializer is like an instance method with no parameters, written using the init keyword:
// default initializer
init() {
print("--> \(#function)")
self.firstName = "NA";
self.lastName = "NA";
self.gender = nil;
print("<-- \(#function)")
}
// name initializer
init(first: String, last: String) {
print("--> \(#function)")
self.firstName = first;
self.lastName = last;
self.gender = nil;
print("<-- \(#function)")
}
// name initializer
init(first: String, last: String, gender: String) {
print("--> \(#function)")
self.firstName = first;
self.lastName = last;
self.gender = gender;
print("<-- \(#function)")
}
public func fullInfo() -> String {
// let variable g take on value.
if let g = self.gender {
return "\(self.fullName()), \(g)";
}
return "Sorry, data is incomplete";
}
// returns a String
private func fullName() -> String {
print("--> \(#function)")
// array named parts
// array of type String
var parts: [String] = []
// optional binding..is it set?
if let firstName = self.firstName {
// if its set, let's add it to the array
parts += [firstName]
}
if let lastName = self.lastName {
// if its set, let's add it to the array
parts += [lastName]
}
print("<-- \(#function)")
return self.toStringFromArray(OfStrings: parts);
}
// takes in parameter of an "Array of type String"
// this parameter's reference is called "data"
// parameter name is called "OfStrings"
// func returns a String
////In Swift, functions have both parameter labels and parameter names
// "parameter label" would be "OfStrings"
// "parameter name" would be "data"
private func toStringFromArray(OfStrings data: [String] ) -> String {
print("--> \(#function)")
var total: String = ""
for aString in data {
total += aString + " ";
}
print("<-- \(#function)");
return total;
}
// using underscore as the parameter label simply means the label is optional
// and that you don't have to do any parameter labeling.
// just do this: person2.test2("pqiweurpqiwuerp")
public func test2(_ data: String, _ data2: String) {
print("--> \(#function)")
print("<-- \(#function)")
}
// you can also use just use the parameter name like so:
// person2.test(AString: "hahahahah")
public func test(AString: String) {
print("--> \(#function)")
print("<-- \(#function)")
}
//explicit - state clearly and in detail
//implicity - imply...suggest.
}
var person1 = Person(first: "Ricky", last: "Tsao", gender: "Male")
print("The full name is: \(person1.fullInfo())")
var person2 = Person(first: "Lily", last: "Gan")
print("The full name is: \(person2.fullInfo())")
person2.test(AString: "hahahahah")
person2.test2("pqiweurpqiwuerp", "hohho")