İçeriğe geç

Swift 3 ile precedencegroup kullanımı

Swift 3

Merhabalar bu yazımda Swift 3 ile birlikte yeni eklenen precedencegroup nedir ? nasıl kullanılır konusuna değineceğim.

Bildiğimiz gibi Swift ile kendi farklı operatörlerimizi overloading yapıp ister Int,String veya kendi Struct,Class yapımızda kullanabiliyoruz. Yani sınıf nesnelerini toplaya bilir çıkarabilir dilediğinizi yapabilirsiniz.

Bu yeni gelen precedencegroup operatörlerin öncelik sırasını ve kullanımını ayarlamanızı sağlıyor. Örnek olarak 5 + 2 * 2 işleminde öncelik çarpmaya ait olduğu gibi kendimizde bu öncelikleri ayarlayıp ona göre işlemler yapabiliyoruz. Mesela yeni yazdığınız bir operatörü toplama işleminden yada çarpma işleminden daha öncelikli yapabiliyorsunuz oldukça güzel bir durum.

Aşağıda verdiğim örnekleri inceleyebilirsiniz. Kullanımı oldukça basit.

precedencegroup Additive {
    associativity: left
}
precedencegroup Multiplicative {
    associativity: left
    higherThan: Additive
}
precedencegroup Exponentiative {
    associativity: left
    higherThan: Additive
}

infix operator + : Additive
infix operator * : Multiplicative
infix operator ** : Exponentiative

extension Int {
    static func ** (rhs:Int,lhs:Int) -> Int {
        return (rhs + lhs) * 2
    }
}

1 + 1 + 2 ** 3  // 12


precedencegroup Newpre {
  associativity: left
  higherThan: Multiplicative
}

infix operator *^: Newpre

extension Float {
    static func *^ (rhs:Float,lhs:Float) -> Float {
    return (rhs * lhs) + rhs
    }
}

2.0 * 5.0 *^ 1.0 // 20

Örnekte gördüğünüz gibi Int sınıfına extend bir operator overload fonksiyon yazdım. Bu fonksiyon operatörü toplama işleminden daha öncelikli haale getirmiş oldum. Diğer bir Float örneğinde ise yazdığım fonksiyon çarpma işleminden daha öncelikli olarak çalışıyor.

Standart olarak Swift üzerine eklenmiş Precedencelerde aşağıdaki gibidir.

precedencegroup AssignmentPrecedence {
  assignment: true
  associativity: right
}
precedencegroup TernaryPrecedence {
  associativity: right
  higherThan: AssignmentPrecedence
}
precedencegroup DefaultPrecedence {
  higherThan: TernaryPrecedence
}
precedencegroup LogicalDisjunctionPrecedence {
  associativity: left
  higherThan: TernaryPrecedence
}
precedencegroup LogicalConjunctionPrecedence {
  associativity: left
  higherThan: LogicalDisjunctionPrecedence
}
precedencegroup ComparisonPrecedence {
  higherThan: LogicalConjunctionPrecedence
}
precedencegroup NilCoalescingPrecedence {
  associativity: right
  higherThan: ComparisonPrecedence
}
precedencegroup CastingPrecedence {
  higherThan: NilCoalescingPrecedence
}
precedencegroup RangeFormationPrecedence {
  higherThan: CastingPrecedence
}
precedencegroup AdditionPrecedence {
  associativity: left
  higherThan: RangeFormationPrecedence
}
precedencegroup MultiplicationPrecedence {
  associativity: left
  higherThan: AdditionPrecedence
}
precedencegroup BitwiseShiftPrecedence {
  higherThan: MultiplicationPrecedence
}

postfix operator ++
postfix operator --
// postfix operator !

prefix operator ++
prefix operator --
prefix operator !
prefix operator ~
prefix operator +
prefix operator -

// infix operator = : AssignmentPrecedence
infix operator *=  : AssignmentPrecedence
infix operator /=  : AssignmentPrecedence
infix operator %=  : AssignmentPrecedence
infix operator +=  : AssignmentPrecedence
infix operator -=  : AssignmentPrecedence
infix operator <<= : AssignmentPrecedence
infix operator >>= : AssignmentPrecedence
infix operator &=  : AssignmentPrecedence
infix operator ^=  : AssignmentPrecedence
infix operator |=  : AssignmentPrecedence

// infix operator ?: : TernaryPrecedence

infix operator ||  : LogicalDisjunctionPrecedence

infix operator &&  : LogicalConjunctionPrecedence

infix operator <   : ComparisonPrecedence
infix operator <=  : ComparisonPrecedence
infix operator >   : ComparisonPrecedence
infix operator >=  : ComparisonPrecedence
infix operator ==  : ComparisonPrecedence
infix operator !=  : ComparisonPrecedence
infix operator === : ComparisonPrecedence
infix operator !== : ComparisonPrecedence
infix operator ~=  : ComparisonPrecedence

infix operator ??  : NilCoalescingPrecedence

// infix operator as : CastingPrecedence
// infix operator as? : CastingPrecedence
// infix operator as! : CastingPrecedence
// infix operator is : CastingPrecedence

infix operator ..< : RangeFormationPrecedence
infix operator ... : RangeFormationPrecedence

infix operator +   : AdditionPrecedence
infix operator -   : AdditionPrecedence
infix operator &+  : AdditionPrecedence
infix operator &-  : AdditionPrecedence
infix operator |   : AdditionPrecedence
infix operator ^   : AdditionPrecedence

infix operator *   : MultiplicationPrecedence
infix operator /   : MultiplicationPrecedence
infix operator %   : MultiplicationPrecedence
infix operator &*  : MultiplicationPrecedence
infix operator &   : MultiplicationPrecedence

infix operator <<  : BitwiseShiftPrecedence
infix operator >>  : BitwiseShiftPrecedence

Github link.

Tarih:SwiftSwift 3

Bu yazı yorumlara kapalı.

Copyright © 2020 Kenan Atmaca