İçeriğe geç

ExpressibleLiteral kullanımı

Merhabalar bu yazımda Swift dilinin güçlü özelliklerinden ExpressibleLiteral Protokolleri nedir ve nasıl kullanırız örneği vereceğim.

Bildiğimiz gibi protokoller Swift dilinin önemli bir kısmını ve mantık yapısını oluşturmakta. Aynı zamanda İOS ve diğer macOS vs. kütüphanelerinin’de mantığı bu yapıda şekillenir.

Bazı özel durum kullanımlarında Class veya Struct yapımızı buna göre şekillenmesini isteyebiliriz. Örneğin generics bir struct yapısında Int olarak belirledikten sonra Int bir değer göndermeliyiz ancak String literal sayesinde String bir değişkende gönderip Int olarak sonuç alabilmekteyiz. Veya Swift dilinde nil yapısı optional değişkenlerde kullanılmaktadır. Degisken? şeklinde ancak yapımızda nil literal kullanarak bu işlemi farklı şekilde yönetebiliyoruz.

Kod örnekleri üzerinden işlemleri daha iyi anlayacaksınız. Aşağıda yazdığım örnekleri inceleyebilirsiniz.

ExpressibleByNilLiteral örneği

enum Optional:ExpressibleByNilLiteral {
 
 case none
 case val(String)
 
 init(nilLiteral: ()) {
  self = .none
  }
    
 }
 
var a:Optional = nil // none
var b = Optional.val("A")

ExpressibleByStringLiteral örneği

extension Int: ExpressibleByStringLiteral {
    public init(stringLiteral value: String) {
        self.init(value)!
    }
    
    public init(extendedGraphemeClusterLiteral value: String) {
       self.init(value)!
    }
    
    public init(unicodeScalarLiteral value: String) {
        self.init(value)!
    }
}

struct exp<T> where T:ExpressibleByStringLiteral {
    
    var value:T?
    
    init(_ val:T?) {
        self.value = val
    }
    
    func printVal() {
        print(value ?? "nil")
    }
}

let obj = exp<Int>("99")
obj.printVal() // 99

ExpressibleByArrayLiteral örneği

struct otherSet<Element:Hashable> {
  
    private var values:[Element:Bool] = [:]
    
    init(){}
    
    var count:Int {
        return values.count
    }
    
    var isEmpty:Bool {
        return values.isEmpty
    }
    
    mutating func put(_ element:Element) {
        values[element] = true
    }
    
    func contains(_ element:Element) -> Bool {
    
        return values[element] ?? false
        
    }
    
    mutating func remove(_ element:Element) -> Bool {
        
        if self.contains(element) {
            values.removeValue(forKey: element)
            return true
        } else {
            return false
        }
        
    }
 
}
extension otherSet:ExpressibleByArrayLiteral {
    init(arrayLiteral: Element...) {
        self.init()
        for element in arrayLiteral {
            self.put(element)
        }
    }
}

var other:otherSet = [1,2,3]
other.count // 3
other.contains(2) // true

Yukardaki Array literal örneğinde eğer literal kullanmazsak değişken yapısına bu şekilde bir yükleme yapamayız. init işlemi yardımıyla ekleme yaparız ancak bu literal sayesinde oldukça güzel bir formatta yükleme yapabilmekteyiz.

Sonuç olarak yazdığımız sınıflar veya structlar,enumlar olsun daha efektiv yapıda kullanmak için bu protokolleri bilmemiz gerekir. Böylelikle Swift dilini en iyi şekilde kullanmış oluruz.

Tarih:SwiftSwift 3

Bu yazı yorumlara kapalı.

Copyright © 2020 Kenan Atmaca