Swift Programming Fundamentals: Variables, Constants, Data Types, and Operators

Swift is a versatile and powerful programming language developed by Apple. Whether you’re an experienced programmer from another language or a beginner taking your first steps in the world of coding, mastering Swift’s basic programming concepts is crucial. In this article, we will explore these fundamental concepts, which include variables, constants, data types, and operators.

Variables and Constants:

Variables and constants are used to store and manage data in a Swift program. Let’s start by understanding the difference between these two fundamental concepts.

  • Variables: In Swift, a variable is a storage location in memory that can hold a value or a reference to an object. Variables are mutable, meaning their values can change after they are initially set. To declare a variable, use the var keyword.
var age = 25
age = 26 // You can change the value of a variable.

Here, age is a variable that can store an integer value, and we change its value from 25 to 26.

  • Constants: A constant, on the other hand, is a storage location in memory that holds a value which cannot be changed once it’s set. To declare a constant, use the let keyword.
let pi = 3.14159
// pi = 3.15 // This will result in an error - constants cannot be changed.

In this example, pi is a constant with a value of 3.14159, and any attempt to change its value will result in an error.

Data Types:

Data types are an essential part of Swift, allowing you to specify what kind of data can be stored in a variable or constant. Swift has various built-in data types to choose from:

  • Integers:

Integers represent whole numbers and can be either signed (positive, negative, or zero) or unsigned (only positive or zero). Common integer data types include Int and UInt.

var temperature: Int = -5
var count: UInt = 100

In this example, we declare a variable temperature as a signed integer and a variable count as an unsigned integer.

  • Floating-Point Numbers:

Floating-point numbers are used to represent real numbers, including decimal values. Swift supports both single-precision (Float) and double-precision (Double) floating-point numbers.

var pi: Double = 3.14159
var height: Float = 175.5

Here, we declare a variable pi as a Double and a variable height as a Float.

  • Strings:

Strings are sequences of characters, and they are represented using the String data type. Swift provides many powerful features for working with strings.

var greeting: String = "Hello, World!"

In this example, greeting is a string variable containing the text “Hello, World!”.

  • Booleans:

Boolean data types represent truth values and can be either true or false. The Bool data type is used for boolean variables.

var isRaining: Bool = true

Here, isRaining is a boolean variable set to true, indicating that it is currently raining.

  • Tuples:

Tuples allow you to group multiple values together into a single compound value. Each value in a tuple can have a different data type.

var coordinates: (Double, Double) = (40.7128, -74.0060)

In this example, coordinates is a tuple containing latitude and longitude values as doubles.

Operators:

Operators are used to perform operations on variables, constants, and values in Swift. Swift provides a wide range of operators, including arithmetic, comparison, logical, and more.

  • Arithmetic Operators:

Arithmetic operators allow you to perform mathematical operations on numeric values. Common arithmetic operators in Swift include + (addition), - (subtraction), * (multiplication), / (division), and % (remainder).

let a = 10
let b = 3
let sum = a + b          // 13
let difference = a - b   // 7
let product = a * b      // 30
let quotient = a / b     // 3
let remainder = a % b    // 1

In this example, we use arithmetic operators to perform various mathematical operations.

  • Comparison Operators:

Comparison operators are used to compare two values. They return a boolean result, true or false.

let x = 5
let y = 7
let isEqual = x == y // false
let isNotEqual = x != y // true
let isGreater = x > y // false
let isLessOrEqual = x <= y // true

Here, we use comparison operators to compare the values of x and y.

  • Logical Operators:

Logical operators are used to combine or negate boolean values. Common logical operators in Swift include && (logical AND), || (logical OR), and ! (logical NOT).

let isSunny = true
let isWarm = false
let isPerfectWeather = isSunny && isWarm // false
let isNotRaining = !isSunny // false

In this example, logical operators are used to combine and negate boolean values.

These are just the basics of Swift’s variables, constants, data types, and operators. As you continue your journey in Swift programming, you’ll discover more advanced concepts and features that will allow you to build sophisticated applications for Apple’s ecosystem.

In conclusion, Swift’s flexibility, performance, and readability make it an excellent choice for both beginners and experienced programmers. With a solid understanding of variables, constants, data types, and operators, you’re well on your way to becoming proficient in Swift and unlocking its full potential for your programming projects. Happy coding!

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/thebasics/

DispatchQueue

swift

What is DispatchQueue in Swift, and what is it used for?

DispatchQueue is a class in Swift that is used for managing concurrent tasks in a serial or concurrent manner. It provides a way to manage tasks on a concurrent queue, with different priorities assigned to different tasks.

A queue is a data structure that follows the “first in, first out” (FIFO) principle, where the first item that is added to the queue is the first item to be processed. In the context of DispatchQueue, a queue is used to manage tasks that are executed concurrently.

DispatchQueue provides two types of queues: serial and concurrent. A serial queue executes only one task at a time, while a concurrent queue can execute multiple tasks simultaneously. In addition to managing task execution, DispatchQueue also provides a way to manage the priority of tasks on a queue.

One common use case for DispatchQueue is performing background processing while keeping the UI responsive. For example, if you have a task that takes a long time to complete (such as downloading a large file), you can use DispatchQueue to perform the task in the background, while the UI remains responsive and the user can continue to interact with the app.

Another use case for DispatchQueue is performing parallel processing, where multiple tasks are executed simultaneously across multiple cores. This can help to improve performance and reduce the time required to complete a set of tasks.

In summary, DispatchQueue is a powerful tool for performing asynchronous and concurrent programming in Swift. It provides a way to manage tasks on a concurrent queue, with different priorities assigned to different tasks. This can be used to perform background processing, parallel processing, or any other scenario where asynchronous and concurrent programming is required.

DispatchQueue is a powerful tool that can be used in a variety of scenarios, such as:

  • Background processing: Use DispatchQueue to perform long-running tasks in the background while keeping the UI responsive.
  • Asynchronous network requests: Use DispatchQueue to make network requests in the background and update the UI when the response is received.
  • Parallel processing: Use DispatchQueue to perform computations in parallel across multiple cores.
  • Priority-based execution: Use DispatchQueue to assign different priorities to tasks and manage their execution.
// Create a new concurrent queue with default priority
let concurrentQueue = DispatchQueue(label: "com.example.myConcurrentQueue", qos: .default, attributes: .concurrent)

// Add a task to the queue
concurrentQueue.async {
    // Perform a task
    print("Task 1 started")
    for i in 1...5 {
        print("Task 1 running - \(i)")
    }
    print("Task 1 completed")
}

// Add another task to the queue
concurrentQueue.async {
    // Perform a task
    print("Task 2 started")
    for i in 1...5 {
        print("Task 2 running - \(i)")
    }
    print("Task 2 completed")
}

// Wait for all tasks to complete
concurrentQueue.sync(flags: .barrier) {
    // Perform a task after all other tasks have completed
    print("All tasks completed")
}

What are the possible values for the “qos” argument?

The qos (quality of service) argument can take any of the following values:

  • .userInteractive: High priority level for tasks that involve user interaction.
  • .userInitiated: High priority level for tasks initiated by the user.
  • .utility: Low priority level for background tasks.
  • .background: Low priority level for long-running background tasks.
  • .default: Default priority level, a mix of other priority levels and the most commonly used.

https://developer.apple.com/documentation/dispatch/dispatchqueue

Kullanışlı swift uzantıları

Metni kırpmak

Swift dilinde bir metin dizesini trim etmek (baştaki ve sonundaki boşlukların silinmesi) ve yeni satır karakterlerini (new line characters) silmek için aşağıdaki gibi bir extension yazabilirsiniz:

extension String {
    func trim() -> String {
        return self.trimmingCharacters(in: .whitespacesAndNewlines)
    }
}

Bu extension’ı kullanarak bir metin dizesini trim edebilirsiniz:

let myString = "   Lorem Ipsum   \n"
let trimmedString = myString.trim()

Bu örnekte trim() metodu myString değişkenini trim ederek boşluk ve yeni satır karakterlerini siler ve trimmedString değişkenine atar. Bu sayede trimmedString değişkeninin içeriği sadece “Lorem Ipsum” olur.

Yazıdan tarihe dönüştürme

Swift dilinde bir metin dizesini bir tarihe dönüştüren bir extension yazarken kullanıcının girdiği date format’ını kullanabilmek için aşağıdaki gibi bir kod yazabilirsiniz:

import Foundation

extension String {
    func toDate(dateFormat: String) -> Date? {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = dateFormat
        return dateFormatter.date(from: self)
    }
}

Bu extension’ı kullanarak bir metin dizesini bir tarihe dönüştürebilirsiniz:

let dateString = "2022-01-12"
let date = dateString.toDate(dateFormat: "yyyy-MM-dd")

Bu örnekte toDate(dateFormat:) metodu dateString değişkenini bir tarihe dönüştürür ve date değişkenine atar. Kullanıcı tarafından girilen dateFormat değişkeni “yyyy-MM-dd” olur ve bu sayede date değişkeninin içeriği Date tipinde bir tarih olur.

Swiftte en popüler 10 açık kaynak framework

Swift dilinde en çok kullanılan açık kaynak framework’ler şu şekildedir:

  • Alamofire: HTTP bağlantılarını yönetmek için kullanılan bir framework.
  • Kingfisher: Resimlerin indirilmesi ve cache’lenmesi için kullanılan bir framework.
  • SDWebImage: Web’den resimlerin indirilmesi ve cache’lenmesi için kullanılan bir framework.
  • SwiftyJSON: JSON verilerinin kolayca işlenmesi için kullanılan bir framework.
  • RxSwift: Reactive programlama için kullanılan bir framework.
  • SnapKit: Auto Layout kullanımını kolaylaştıran bir framework.
  • Moya: Networking işlemlerini kolaylaştıran bir framework.
  • Realm: Veritabanı işlemleri için kullanılan bir framework.
  • ObjectMapper: JSON veya diğer veri formatlarının modellere dönüştürülmesi için kullanılan bir framework.

IOS deep linking ve universal links nedir & nasıl yapılır

Deep linking, türkçe ifade etmeye çalışırsak: derin bağlantılama;

Bildiğiniz gibi, bağlantıları web sitelerin içeriğine ulaşmak için kullanırız,

http://www.ftorun.com gibi veya site içerisindeki bir bağlantı

http://www.ftorun.com/programlama/c-sharp/webconfigde-deger-tutmak.aspx gibi.

Bu adresler sizin direk olarak istediğiniz web sayfayasına ulaşmanızı sağlar.

Ancak bir mobil uygulama geliştirdiysek ve uygulama içerisindeki bir sayfaya direk ulaşma ihtiyacımız olursa ne yapacağız, bu tarz durumlar için URL şemaları tanımlamamız gerekiyor. Uygulamamızı oluştururken mesela myapp şemasını kullanmayı seçtiğimiz zaman myapp:// yazarak herhangi bir başka uygulama üzerinden veya web sitesinden uygulamanızı kolayca açabilirsiniz.

Peki uygulamanızın içerisindeki özel bir içeriğe bu adresten direk ulaşmak istersek ? O zaman da myapp://takvim yazarak içerisine takvim parametresini göndermiş oluruz, burada gönderdiğimiz parametre tamamen bize kalmış bu noktada hiyerarşik düzenli bir yapı kullanarak uygulamanın bütün alanlarına kolayca dışarıdan erişim sağlayabiliriz.

Peki ama bizim bir web sitemiz var ve bu web sitesine uyumlu bir de mobil uygulama yaptık.  Mobil  uygulama üzerinden web sitesine girmeye çalışıldığında da uygulama yüklüyse uygulamanızın ilgili kısmının açılmasını istiyoruz. Eminim bu şekilde çalışan bir çok uygulama görmüşsünüzdür. Şimdi kendi uygulamanızda bunu nasıl gerçekleştirebileceğinizi anlatmaya çalışacağım.

IOS 9dan önce web sitenizi uygulamanız ile entegre etmek için webden mobil cihazı algılayıp kendi custom şemanıza yönlendirme yapmanız gerekiyordu, IOS 9 ile birlikte apple “IOS Universal Link” sistemini getirdi, böylelikle uygulamanız ve web siteniz ortak bir şemayı kullanabilecek.

Peki neler yapmamız gerekiyor.

1. Apple geliştirici sitesinden App Id  Associated Domains düzenlemesi: developer.apple.com sitesine girip App IDs kısmından uygulamanızı daha önceden oluşturmuş olmalısınız, oradan edit seçeneğini seçerek Associated Domains özelliğini aktif yapalım.

2. XCode projemizden uygulamamızın Capabilities kısmını aktif edip ardından aşağıda yer alan domains kısmından applinks:www.mywebsite.com şeklinde ekleyelim.

3.Web sitemizde yapmamız gereken düzenlemeler: web sitemizin bize ait olduğunu ve onu mobil uygulamanın yansıması olarak kullanacağımızı apple’a (bir nevi) inandırmak için uygulamamızın ana dizinine apple-app-site-association isimli bir dosya oluşturmamız gerekiyor.

Kısaca AASA (apple-app-site-association) dosyası da denilen bu dosyanın yapısı şu şekilde olmalı:

{
  "applinks": {
    "apps": [],
    "details": [
      {
        "appID": “JHGFJHHYX.com.facebook.ios",
        "paths": [
          "*"
        ]
      }
    ]
  }
}

Dosyayı oluşturduktan sonra uygulamanın ana dizinine eklediğinizde ve şu adrese girdiğinizde dosyayı gördüğünüzden emin olun

https://<<sitenizin_adresi>>/apple-app-site-association 

ayrıca şunlara dikkat edin:

  • Dosyanın uzantısı olmadığından emin olun, adı direk “apple-app-site-association” olsun.
  • Siteniz HTTPS üzerinde çalışmalı.
  • Sunucunuzda application/json MIME tipi tanımlanmış olsun.
  • dosyanın büyüklüğü 128kb ı geçmemeli.

işiniz bittiğinde bu siteden kontrol edebilirsiniz:

https://branch.io/resources/aasa-validator/#resultsbox

Artık uygulamamıza IOS evrensel bağlantılarını neredeyse kurduk ve web sitemiz ile bağladık geriye bir tek bunu uygulamanın içerisinden yakalamak kaldı.

Uygulama içerisinde appdelegate içinden

application:continueUserActivity:restorationHandler

metodunu kullanarak gelen adres içeriğine ulaşabiliriz,


func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
    print("Continue User Activity called: ")
    if userActivity.activityType == NSUserActivityTypeBrowsingWeb {
        let url = userActivity.webpageURL!
        print(url.absoluteString)
    }
    return true
}