2020-10-06 11:23:25 +00:00
|
|
|
class Person {
|
|
|
|
// We can define class property here
|
|
|
|
var age = 25
|
|
|
|
// Implement Class initializer. Initializers are called when a new object of this class is created
|
|
|
|
init() {
|
|
|
|
print(“A new instance of this class Person is created.”)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// We can now create an instance of class Person - an object - by putting parentheses after the class name
|
|
|
|
let personObj = Person()
|
|
|
|
// Once an instance of Person class is created we can access its properties using the dot “.” syntax.
|
|
|
|
print(“This person age is \(personObj.age)”)
|
|
|
|
|
|
|
|
import Foundation
|
|
|
|
class Friend : Comparable {
|
|
|
|
let name : String
|
|
|
|
let age : Int
|
|
|
|
|
|
|
|
init(name : String, age: Int) {
|
|
|
|
self.name = name
|
|
|
|
self.age = age
|
|
|
|
}
|
|
|
|
}
|
|
|
|
func < (lhs: Friend, rhs: Friend) -> Bool {
|
2020-10-06 15:26:37 +00:00
|
|
|
return lhs.age < rhs.age }; func > (lhs: Friend, rhs: Friend) -> Bool {
|
2020-10-06 11:23:25 +00:00
|
|
|
return lhs.age > rhs.age
|
|
|
|
}
|
|
|
|
func == (lhs: Friend, rhs: Friend) -> Bool {
|
|
|
|
var returnValue = false
|
|
|
|
if (lhs.name == rhs.name) && (lhs.age == rhs.age)
|
|
|
|
{
|
|
|
|
returnValue = true
|
|
|
|
}
|
|
|
|
return returnValue
|
|
|
|
}
|
|
|
|
|
|
|
|
let friend1 = Friend(name: "Sergey", age: 35)
|
|
|
|
let friend2 = Friend(name: "Sergey", age: 30)
|
|
|
|
|
2020-10-06 15:26:37 +00:00
|
|
|
print("Compare Friend object. Same person? (friend1 == friend2)")
|
2020-10-06 11:23:25 +00:00
|
|
|
|
|
|
|
func sayHelloWorld() {
|
|
|
|
print("Hello World")
|
|
|
|
}
|
|
|
|
// Call function
|
|
|
|
sayHelloWorld()
|
|
|
|
|
|
|
|
func printOutFriendNames(names: String...) {
|
|
|
|
|
|
|
|
for name in names {
|
|
|
|
|
|
|
|
print(name)
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
// Call the printOutFriendNames with two parameters
|
|
|
|
printOutFriendNames("Sergey", "Bill")
|
|
|
|
// Call the function with more parameters
|
|
|
|
printOutFriendNames("Sergey", "Bill", "Max")
|
|
|
|
|
|
|
|
let simpleClosure = {
|
|
|
|
print("From a simpleClosure")
|
|
|
|
}
|
|
|
|
// Call closure
|
|
|
|
simpleClosure()
|
|
|
|
|
|
|
|
let fullName = { (firstName:String, lastName:String)->String in
|
|
|
|
return firstName + " " + lastName
|
|
|
|
}
|
|
|
|
// Call Closure
|
|
|
|
let myFullName = fullName("Sergey", "Kargopolov")
|
|
|
|
print("My full name is \(myFullName)")
|
|
|
|
|
|
|
|
let myDictionary = [String:String]()
|
|
|
|
// Another way to create an empty dictionary
|
|
|
|
let myDictionary2:[String:String] = [:]
|
|
|
|
// Keys in dictionary can also be of type Int
|
|
|
|
let myDictionary3 = [Int:String]()
|
|
|
|
|
|
|
|
var myDictionary = ["first_name": "Sergey", "last_name": "Kargopolov"]
|
|
|
|
// print to preview
|
|
|
|
print(myDictionary)
|
|
|
|
// Add a new key with a value
|
|
|
|
myDictionary["user_id"] = "f5h7ru0tJurY8f7g5s6fd"
|
|
|
|
// We should now have 3 key value pairs printed
|
|
|
|
print(myDictionary)
|
|
|
|
|
|
|
|
var myDictionary = ["first_name": "Sergey", "last_name": "Kargopolov"]
|
|
|
|
// Loop through dictionary keys and print values
|
|
|
|
for (key,value) in myDictionary {
|
|
|
|
print("\(key) = \(value)")
|
|
|
|
}
|
|
|
|
class Friend {
|
|
|
|
let name : String
|
|
|
|
let age : Int
|
|
|
|
|
|
|
|
init(name : String, age: Int) {
|
|
|
|
self.name = name
|
|
|
|
self.age = age
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
var friends:[Friend] = []
|
|
|
|
|
|
|
|
let friend1 = Friend(name: "Sergey", age: 30)
|
|
|
|
let friend2 = Friend(name: "Bill", age: 35)
|
|
|
|
let friend3 = Friend(name: "Michael", age: 21)
|
|
|
|
|
|
|
|
friends.append(friend1)
|
|
|
|
friends.append(friend2)
|
|
|
|
friends.append(friend3)
|
|
|
|
|
|
|
|
printFriends(friends: friends)
|
|
|
|
|
|
|
|
// Get sorted array in descending order (largest to the smallest number)
|
|
|
|
let sortedFriends = friends.sorted(by: { $0.age > $1.age })
|
|
|
|
printFriends(friends: sortedFriends)
|
|
|
|
|
|
|
|
// Get sorted array in ascending order (smallest to the largest number)
|
|
|
|
let sortedFriendsAscendingOrder = friends.sorted(by: { $0.age < $1.age })
|
|
|
|
printFriends(friends: sortedFriendsAscendingOrder)
|
|
|
|
|
|
|
|
|
|
|
|
func printFriends(friends: [Friend])
|
|
|
|
{
|
|
|
|
for friendEntry in friends {
|
|
|
|
print("Name: \(friendEntry.name), age: \(friendEntry.age)")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
import UIKit
|
|
|
|
class ViewController: UIViewController {
|
|
|
|
override func viewDidLoad() {
|
|
|
|
super.viewDidLoad()
|
|
|
|
}
|
|
|
|
override func viewWillAppear(_ animated: Bool) {
|
|
|
|
super.viewWillAppear(animated)
|
|
|
|
|
|
|
|
// Create destination URL
|
|
|
|
let documentsUrl:URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first as URL!
|
|
|
|
let destinationFileUrl = documentsUrl.appendingPathComponent("downloadedFile.jpg")
|
|
|
|
|
|
|
|
//Create URL to the source file you want to download
|
|
|
|
let fileURL = URL(string: "https://s3.amazonaws.com/learn-swift/IMG_0001.JPG")
|
|
|
|
|
|
|
|
let sessionConfig = URLSessionConfiguration.default
|
|
|
|
let session = URLSession(configuration: sessionConfig)
|
|
|
|
|
|
|
|
let request = URLRequest(url:fileURL!)
|
|
|
|
|
|
|
|
let task = session.downloadTask(with: request) { (tempLocalUrl, response, error) in
|
|
|
|
if let tempLocalUrl = tempLocalUrl, error == nil {
|
|
|
|
// Success
|
|
|
|
if let statusCode = (response as? HTTPURLResponse)?.statusCode {
|
|
|
|
print("Successfully downloaded. Status code: \(statusCode)")
|
|
|
|
}
|
|
|
|
|
|
|
|
do {
|
|
|
|
try FileManager.default.copyItem(at: tempLocalUrl, to: destinationFileUrl)
|
|
|
|
} catch (let writeError) {
|
|
|
|
print("Error creating a file \(destinationFileUrl) : \(writeError)")
|
|
|
|
}
|
|
|
|
|
|
|
|
} else {
|
|
|
|
print("Error took place while downloading a file. Error description: %@", error?.localizedDescription);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
task.resume()
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
do {
|
|
|
|
|
|
|
|
// Convert JSON Object received from server side into Swift NSArray.
|
|
|
|
// Note the use "try"
|
|
|
|
if let convertedJsonIntoArray = try JSONSerialization.JSONObjectWithData(data!, options: []) as? NSArray {
|
|
|
|
}
|
|
|
|
|
|
|
|
} catch let error as NSError {
|
|
|
|
print(error.localizedDescription)
|
|
|
|
}
|
|
|
|
|
|
|
|
DispatchQueue.global(qos: .userInitiated).async {
|
|
|
|
// Do some time consuming task in this background thread
|
|
|
|
// Mobile app will remain to be responsive to user actions
|
|
|
|
|
|
|
|
print("Performing time consuming task in this background thread")
|
|
|
|
|
|
|
|
DispatchQueue.main.async {
|
|
|
|
// Task consuming task has completed
|
|
|
|
// Update UI from this block of code
|
|
|
|
print("Time consuming task has completed. From here we are allowed to update user interface.")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
import UIKit
|
|
|
|
class ViewController: UIViewController {
|
|
|
|
|
|
|
|
override func viewDidLoad() {
|
|
|
|
super.viewDidLoad()
|
|
|
|
// Do any additional setup after loading the view, typically from a nib.
|
|
|
|
|
|
|
|
let button = UIButton(type: UIButtonType.system) as UIButton
|
|
|
|
|
|
|
|
let xPostion:CGFloat = 50
|
|
|
|
let yPostion:CGFloat = 100
|
|
|
|
let buttonWidth:CGFloat = 150
|
|
|
|
let buttonHeight:CGFloat = 45
|
|
|
|
|
|
|
|
button.frame = CGRect(x:xPostion, y:yPostion, width:buttonWidth, height:buttonHeight)
|
|
|
|
|
|
|
|
button.backgroundColor = UIColor.lightGray
|
|
|
|
button.setTitle("Tap me", for: UIControlState.normal)
|
|
|
|
button.tintColor = UIColor.black
|
|
|
|
button.addTarget(self, action: #selector(ViewController.buttonAction(_:)), for: .touchUpInside)
|
|
|
|
|
|
|
|
self.view.addSubview(button)
|
|
|
|
}
|
|
|
|
|
|
|
|
func buttonAction(_ sender:UIButton!)
|
|
|
|
{
|
|
|
|
print("Button tapped")
|
|
|
|
}
|
|
|
|
|
|
|
|
override func didReceiveMemoryWarning() {
|
|
|
|
super.didReceiveMemoryWarning()
|
|
|
|
// Dispose of any resources that can be recreated.
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
import UIKit
|
|
|
|
class ViewController: UIViewController {
|
|
|
|
|
|
|
|
override func viewDidLoad() {
|
|
|
|
super.viewDidLoad()
|
|
|
|
|
|
|
|
//Create Activity Indicator
|
|
|
|
let myActivityIndicator = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.gray)
|
|
|
|
|
|
|
|
// Position Activity Indicator in the center of the main view
|
|
|
|
myActivityIndicator.center = view.center
|
|
|
|
|
|
|
|
// If needed, you can prevent Acivity Indicator from hiding when stopAnimating() is called
|
|
|
|
myActivityIndicator.hidesWhenStopped = false
|
|
|
|
|
|
|
|
// Start Activity Indicator
|
|
|
|
myActivityIndicator.startAnimating()
|
|
|
|
|
|
|
|
// Call stopAnimating() when need to stop activity indicator
|
|
|
|
//myActivityIndicator.stopAnimating()
|
|
|
|
|
|
|
|
|
|
|
|
view.addSubview(myActivityIndicator)
|
|
|
|
}
|
|
|
|
|
|
|
|
override func didReceiveMemoryWarning() {
|
|
|
|
super.didReceiveMemoryWarning()
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|