İçeriğe geç

RawRepresentable kullanımı

Merhabalar bu yazımda Swift ile birlikte enum üzerinde kullanılan protocol olan RawRepresentable‘ı nasıl kullanırız ne işe yarar bunu görmüş olacağız.

Protokoller bildiğimiz gibi Swift dilinde çok önemli bir yer tutmakta. Programlamaya modern yeni bir anlayış getirmekteler. Swift dili içerisinde bulunan sistem protokolleride kullanılan yapılarda değişikler yapmamızı ve bize fayda sağlayan özellikler eklememizi sağlar.

Bu yazımda belirttiğim RawRepresentable protokolüde enumlar üzerinde raw işleminde farklı işlemler yapmamıza olanak sağlar.

Öncelikle normal bir enum raw örneği verecek olursam.

enum bits:UInt8 {
    case A = 0b00000001
    case B = 0b00010000
    case C = 0b10000000
}

bits.C.rawValue // 128

Enumlar üzerinde rawValue bize değeri döndürmekte.

RawRepresentable ile farklı bir örnek yazarsak.

enum VQuality:CGSize { // Error
    case hd = CGSize.init(width: 1920, height: 1080)
}

CGSize,CGPoint gibi sınıfları enumda yukardaki şekilde kullandığımızda raw hatası verecektir. Ancak aşağıdaki şekilde kullanımda sorunsuz olarak kullanabilirsiniz.

enum VQuality {
    case p2160
    case p1080
    case p720
}

extension VQuality: RawRepresentable {
    
    typealias RawValue = CGSize
    
    init?(rawValue: CGSize) {
        if rawValue == CGSize.init(width: 3840, height: 2160) {
            self = .p2160
        } else if rawValue == CGSize.init(width: 1920, height: 1080) {
            self = .p1080
        } else {
            self = .p720
        }
    }
    
    var rawValue: CGSize {
        switch self {
        case .p2160:
            return CGSize.init(width: 3840, height: 2160)
        case .p1080:
            return CGSize.init(width: 1920, height: 1080)
        case .p720:
            return CGSize.init(width: 1280, height: 720)
        }
    }
}

let videoQ = VQuality(rawValue: CGSize(width: 1920, height: 1080)) // .p1080
videoQ?.rawValue.width // 1920
videoQ?.rawValue.height // 1080

VQuality.p720.rawValue // 1280,720

 

 

Tarih:SwiftSwift 3

Bu yazı yorumlara kapalı.

Copyright © 2020 Kenan Atmaca