به نام خدا

شده تا حالا یه کلاس یا استراکت ساخته باشد و مثلا امتیاز رو توش نگه داری کنید و بخواید که هرموقع اونا رو به شکل score1+score2 مینویسید خودش بفهمه که باید فیلد امتیاز ها رو باهم جمع کنه اما همیشه بهتون این ارور رو میده که + یه عملگر برای اعداده نه استراکت از نوع Score

عملگرها توی سویفت دو دسته اند

یا وجود دارند مثل += و + و - و /= و چیزای دیگه ای که بلدیم و یا اصلا وجود ندارن مثل ‍<~ که خودمون میتونیم براش تعریف کنیم

تقسیم بندی عملگرها بر اساس تعداد عملوند در سویفت:

۱. prefix: عملگر هایی که فقط یک عملوند دارند و ابتدای آن عملوند میایند مثل علامت نقیض a! که مقدار بولین را برعکس میکند

۲. postfix: عملگر های یک عملوندی که عملگر بعد از عملوند می آید مثل ! که برای متغییر های آپشنال استفاده میکنیم مثلا  !a که به معنای این هست که a نمیتواند خالی باشد

۳.infrix: عملگر هایی که دو عملوند دارند و عملگر بین آنها می آید مثل خیلی از عملگرهای معروف مثل جمع و ضرب و تفریق و -= و ...

۴.ternary operator: که عملگری هستند که سه عملوند دارند مانند عملگر ? :  اما در این مطلب توضیح داده نمیشن

 اپراتور های از پیش ساخته شده:

برای استفاده از این عملگر ها و شخصی سازیشون کافیه یه تابع static بسازید و به این نکته توجه کنید که تابع رو توی هر کلاسی که تعریف کنید باید یکی از حداقل یکی از پارامتر ها باید از همون نوع کلاس باشه در بالا توضیح داده شد که عملگر ها بر اساس pastfix و prefix و infrix چند پارامتر به عنوان ورودی باید بگیرند مثلا عملگر == باید دو ورودی داشته باشد که یکی از. آنها حتما باید از نوع کلاسی باید که تابع درون آن تعریف میشود

گاهی ممکن است بخواهیم عملگری را برای کلاس که به آن دسترسی نداریم مثلا کلاس String بنویسیم که در آن صورت باید از. Extention ها استفاده کنیم

extension String {
    static func += ( lhs : inout String,rhs : Int) {
        lhs = lhs + String(describing: rhs)
    }
}

توضیح کلمه کلیدی inout:

خب لازم به توضیح هست که کلمه کلیدی inout به معنی اینه که پارامتر اولی هر مقداری که توی تابع بگیره مقدار حقیقشم که اون بالا هست تغییر میکنه و الان میتونیم تابع بالایی که ساختیم اینجوری استفاده کنیم

var str  = "salam"
var number = 5
str += number

حالا کافیه مقدار str رو پرینت کنید و ببینید مقدار برابر شده با salam5 و این یعنی اپراتوری که ساختید داره کار میکنه

بازم لازم به توضیحه که inout رو میتونید برای هر دو ورودیتون بزارید و هر دو متغییر رو مقدارشونو تغییر بدید مثلا فرض کنید که بخواید یه عملگر برای سواپ یعنی تغییر مقدار دو متعییر بنویسید بعد متوجه میشید که نیاز دارید برای هر دو ورودی ها inout بزارید

اگر در زبان سی کار کرده باشید قطعا مفهوم پوینتر و اشاره گر ها رو میدونید

شما وقتی از inout استفاده میکنید دارید اشاره گر متغییر رو میفرستید بخاطر همینه که میتونید مقدار متغییر رو تغییر بدید

حالا همه عملگرهایی که تا حالا باهاشون کار میکردید رو میتونید کاستوم کنید و لذت ببرید

 

تعریف یک عملگر جدید:

برای تعریف یک عملگر جدید باید از دستور زیر استفاده کنید:

infix operator ~>

حواستون به این باشه که کد بالا رو باید گلوبال تعریف کنید یعنی نباید توی هیچ کلاسی باشه و باید فقط توی یه فایل باشه (در داخل هیچ آکولاد باز و بسته ای نباشه)

و ممکنه بخواید که عملگرتون رو مثل باقی عملگر ها بهش اولیت بدید 

اول جدول اولیت ها رو ببینید

 

خب حالا برای اینکه عملگرمون رو اولیت بدیم این شکلیش میکنیم:

infix operator -! : AdditionPrecedence

خط بالا اولیت عملگر ما رو برابر عملگر ضرب جمع قرار میده

اما گاهی میشه که ما حتی پارو فراتر میزاریم و اولیت رو هم خودمون تعریف میکنیم به این شکل:

precedencegroup SquareSumOperatorPrecedence {
    lowerThan: MultiplicationPrecedence
    higherThan: AdditionPrecedence
    associativity: left
    assignment: false
}

اسم این اولیت رو میزاریم  SquareSumOperatorPrecedence که اولیتش از ضرب پایین تر. و از جمع بالا تره و از سمت چپ هم شرکت پذیره و علامت هم نداره

برای امشب کافیه

موفق باشید

امیدوارم این آموزشا یه روز به کارتون بیاد 

یاعلی مدد