├── .gitignore ├── 404.md ├── Gemfile ├── Gemfile.lock ├── LICENSE ├── README.md ├── _config.yml ├── _includes ├── comment.html ├── edit-on-github.html ├── footer.html ├── head.html ├── header.html ├── post-item.html └── sidebar.html ├── _layouts ├── default.html ├── jetpack-content-page.html ├── page.html ├── post.html └── tutorial.html ├── _plugins └── markdown.rb ├── _posts ├── 2017-4-18-use-kotlin-with-npm-webpack-and-react │ └── 2017-4-18-use-kotlin-with-npm-webpack-and-react.md ├── 2017-4-4-kotlin-native-tech-preview-kotlin-without-a-vm │ └── 2017-4-4-kotlin-native-without-vm.md ├── 2017-4-5-kotlin-1-1-is-also-for-android-developers │ └── 2017-4-5-kotlin-1-1-is-also-for-android-developers.md ├── 2017-4-6-kotlin-1-1-event-report │ └── 2017-4-6-kotlin-1-1-event-report.md ├── 2017-5-12-kotlin-native-v0-2-is-out │ └── 2017-5-12-kotlin-native-v0-2-is-out.md ├── 2017-5-17-kotlin-on-android-now-official │ └── 2017-5-17-kotlin-on-android-now-official.md ├── 2017-6-22-kotlin-native-v0-3 │ └── 2017-6-22-kotlin-native-v0-3.md ├── 2018-5-1-running-restful-app-with-spring-boot-and-kotlin │ └── 2018-5-1-running-restful-app-with-spring-boot-and-kotlin.md ├── 2019-05-24-new-kotlinfarsi │ └── 2019-05-24-new-kotlinfarsi.md ├── 2019-06-02-kotlin-weekly-148 │ └── 2019-06-02-kotlin-weekly-148.md ├── 2019-06-09-kotlin-weekly-149 │ └── 2019-06-09-kotlin-weekly-149.md ├── 2019-06-24-kotlin-everywhere-report │ └── 2019-06-24-kotlin-everywhere-report.md └── 2019-08-05-just-a-simple-repo │ └── 2019-08-05-just-a-simple-repo.md ├── _redirects ├── _sass ├── _animate.scss ├── _base.scss ├── _easybook.scss ├── _home.scss ├── _layout.scss ├── _post.scss └── _syntax-highlighting.scss ├── _tutorials ├── advanced │ └── advanced.md ├── android-jetpack │ ├── contents.md │ └── room │ │ ├── adding-comments-to-app.md │ │ ├── adding-search-feature-and-migration-and-final.md │ │ ├── creating-database-and-repository.md │ │ ├── creating-first-dao.md │ │ ├── creating-first-entity.md │ │ ├── final-app-and-start-coding.md │ │ ├── introduction.md │ │ ├── modifying-product-view.md │ │ └── modifying-view-and-viewmodel-layer.md ├── android │ ├── anko-and-extension-functions.md │ ├── classes-and-functions.md │ ├── creating-a-new-project.md │ ├── data-classes.md │ ├── getting-ready.md │ ├── introduction.md │ ├── making-the-forecast-list-clickable.md │ ├── operators-overloading.md │ ├── parsing-data.md │ ├── retrieving-data-from-api.md │ ├── variables-and-properties.md │ └── writing-your-first-class.md ├── introduction │ ├── a-brief-look-at-generics-in-kotlin-and-summary.md │ ├── annotations-in-kotlin-and-summary.md │ ├── classes-in-kotlin.md │ ├── classes-in-kotlin │ │ ├── result-1.PNG │ │ ├── result-2.PNG │ │ └── result-3.PNG │ ├── closures-in-kotlin.md │ ├── conditional-execution-with-if-and-when-in-kotlin.md │ ├── conditional-execution-with-if-and-when-in-kotlin │ │ ├── result-1.PNG │ │ └── result-2.PNG │ ├── conventions-used-with-kotlin-and-summary.md │ ├── declaring-constants.md │ ├── declaring-variables-in-kotlin.md │ ├── declaring-variables-in-kotlin │ │ └── first-view-of-variables.PNG │ ├── deconstructing-values.md │ ├── enum-classes-in-kotlin.md │ ├── enum-classes-in-kotlin │ │ ├── result-1.PNG │ │ ├── result-2.PNG │ │ └── result-3.PNG │ ├── extension-functions-from-java.md │ ├── extension-functions-in-kotlin-and-summary.md │ ├── extension-functions-in-kotlin-and-summary │ │ └── result-1.PNG │ ├── filtering-mapping-and-flatmapping-in-kotlin.md │ ├── function-with-default-and-named-parameters-in-kotlin.md │ ├── function-with-unlimited-parameters-in-kotlin-and-summary.md │ ├── functions-in-kotlin.md │ ├── higher-order-functions-in-kotlin.md │ ├── higher-order-functions-in-kotlin │ │ └── result-1.PNG │ ├── inheritance-in-kotlin.md │ ├── installing-the-tooling.md │ ├── interfaces-in-kotlin.md │ ├── interfaces-in-kotlin │ │ └── result-1.PNG │ ├── interop-with-java-7-and-8-and-summary.md │ ├── interoperability-with-java.md │ ├── introduction-to-jvm.md │ ├── kotlin-data-classes.md │ ├── kotlin-data-classes │ │ ├── result-1.PNG │ │ ├── result-2.PNG │ │ ├── result-3.PNG │ │ └── result-4.PNG │ ├── kotlin-standard-library-and-working-with-collections-in-kotlin.md │ ├── kotlin-standard-library-and-working-with-collections-in-kotlin │ │ ├── kotlin-collection.png │ │ ├── list-collection.png │ │ ├── listof-type.png │ │ └── listof.png │ ├── kotlin-with-intellij-idea.md │ ├── kotlin-with-intellij-idea │ │ ├── compiled-application.PNG │ │ ├── create-main.PNG │ │ ├── debug-application.PNG │ │ ├── new-project-1.PNG │ │ ├── new-project-2.PNG │ │ ├── new-project-3.PNG │ │ ├── view-of-first-application.PNG │ │ ├── view-of-main.PNG │ │ └── welcome-to-intellij-idea.PNG │ ├── lambda-expressions-in-kotlin.md │ ├── lambda-expressions-in-kotlin │ │ └── result-1.PNG │ ├── loops-and-ranges-in-kotlin.md │ ├── loops-and-ranges-in-kotlin │ │ └── view-of-class.PNG │ ├── member-functions-in-kotlin.md │ ├── null-safety-and-summary.md │ ├── null-safety-and-summary │ │ └── result-1.PNG │ ├── objects-in-kotlin-and-summary.md │ ├── package-and-imports-in-kotlin-and-summary-of-kotlin-basic.md │ ├── package-and-imports-in-kotlin-and-summary-of-kotlin-basic │ │ └── someutils.PNG │ ├── sub1.md │ ├── sub10.md │ ├── sub11.md │ ├── sub2.md │ ├── sub3.md │ ├── sub4.md │ ├── sub5.md │ ├── sub6.md │ ├── sub7.md │ ├── sub8.md │ ├── sub9.md │ ├── talking-to-java-from-kotlin.md │ ├── talking-to-kotlin-from-java.md │ ├── talking-to-kotlin-from-java │ │ ├── completion-2.PNG │ │ ├── completion-3.PNG │ │ ├── error-1.PNG │ │ ├── warning-1.PNG │ │ └── warning-2.PNG │ ├── the-kotlin-repl.md │ ├── the-kotlin-repl │ │ ├── bye-repl.png │ │ ├── hello-fun.png │ │ ├── hello-world.png │ │ ├── kotlinc-command.png │ │ └── repl-in-idea.png │ ├── the-structure-of-kotlin-application.md │ ├── top-level-functions-and-properties-in-kotlin.md │ ├── top-level-functions-and-properties-in-kotlin │ │ ├── output-1.png │ │ └── output-2.png │ ├── tuples.md │ ├── type-casting-in-kotlin.md │ ├── type-casting-in-kotlin │ │ └── result-1.PNG │ ├── typealias-in-kotlin.md │ ├── visibility-modifiers-in-kotlin.md │ ├── welcome-to-the-course.md │ ├── why-kotlin.md │ ├── working-with-abstract-classes-in-kotlin.md │ ├── working-with-basic-types-in-kotlin.md │ ├── working-with-exceptions.md │ ├── working-with-exceptions │ │ ├── result-1.PNG │ │ └── result-2.PNG │ └── working-with-nulls-from-java.md └── js │ ├── hello-world.md │ ├── introduction.md │ ├── javascript-introp-subject.md │ ├── javascript-introp.md │ ├── kotlin-basics.md │ ├── next-session-comming-soon.md │ ├── working-with-the-dom-part1.md │ ├── working-with-the-dom-part2.md │ └── working-with-the-dom-part3.md ├── about.md ├── assets ├── css │ └── main.scss ├── fonts │ ├── Vazir-Bold.eot │ ├── Vazir-Bold.ttf │ ├── Vazir-Bold.woff │ ├── Vazir-Light.eot │ ├── Vazir-Light.ttf │ ├── Vazir-Light.woff │ ├── Vazir.eot │ ├── Vazir.ttf │ ├── Vazir.woff │ └── fonts.css ├── img │ ├── android-jetpack │ │ └── room │ │ │ ├── adding-search-feature-and-migration-and-final │ │ │ └── Slide32.JPG │ │ │ ├── creating-first-dao │ │ │ └── dao.png │ │ │ ├── creating-first-entity │ │ │ ├── 1.png │ │ │ ├── 2.png │ │ │ └── 3.png │ │ │ ├── final-app-and-start-coding │ │ │ └── final-ss.png │ │ │ └── introduction │ │ │ └── what-we-learn.JPG │ ├── introduction │ │ ├── classes-in-kotlin │ │ │ ├── result-1.PNG │ │ │ ├── result-2.PNG │ │ │ └── result-3.PNG │ │ ├── conditional-execution-with-if-and-when-in-kotlin │ │ │ ├── result-1.PNG │ │ │ └── result-2.PNG │ │ ├── declaring-variables-in-kotlin │ │ │ └── first-view-of-variables.PNG │ │ ├── enum-classes-in-kotlin │ │ │ ├── result-1.PNG │ │ │ ├── result-2.PNG │ │ │ └── result-3.PNG │ │ ├── extension-functions-in-kotlin-and-summary │ │ │ └── result-1.PNG │ │ ├── higher-order-functions-in-kotlin │ │ │ └── result-1.PNG │ │ ├── interfaces-in-kotlin │ │ │ ├── README.md │ │ │ └── result-1.PNG │ │ ├── kotlin-data-classes │ │ │ ├── result-1.PNG │ │ │ ├── result-2.PNG │ │ │ ├── result-3.PNG │ │ │ └── result-4.PNG │ │ ├── kotlin-standard-library-and-working-with-collections-in-kotlin │ │ │ ├── kotlin-collection.png │ │ │ ├── list-collection.png │ │ │ ├── listof-type.png │ │ │ └── listof.png │ │ ├── kotlin-with-intellij-idea │ │ │ ├── compiled-application.PNG │ │ │ ├── create-main.PNG │ │ │ ├── debug-application.PNG │ │ │ ├── new-project-1.PNG │ │ │ ├── new-project-2.PNG │ │ │ ├── new-project-3.PNG │ │ │ ├── view-of-first-application.PNG │ │ │ ├── view-of-main.PNG │ │ │ └── welcome-to-intellij-idea.PNG │ │ ├── lambda-expressions-in-kotlin │ │ │ └── result-1.PNG │ │ ├── loops-and-ranges-in-kotlin │ │ │ └── view-of-class.PNG │ │ ├── null-safety-and-summary │ │ │ └── result-1.PNG │ │ ├── package-and-imports-in-kotlin-and-summary-of-kotlin-basic │ │ │ └── someutils.PNG │ │ ├── talking-to-kotlin-from-java │ │ │ ├── completion-2.PNG │ │ │ ├── completion-3.PNG │ │ │ ├── error-1.PNG │ │ │ ├── warning-1.PNG │ │ │ └── warning-2.PNG │ │ ├── the-kotlin-repl │ │ │ ├── bye-repl.png │ │ │ ├── hello-fun.png │ │ │ ├── hello-world.png │ │ │ ├── kotlinc-command.png │ │ │ └── repl-in-idea.png │ │ ├── top-level-functions-and-properties-in-kotlin │ │ │ ├── output-1.png │ │ │ └── output-2.png │ │ ├── type-casting-in-kotlin │ │ │ └── result-1.PNG │ │ └── working-with-exceptions │ │ │ ├── result-1.PNG │ │ │ └── result-2.PNG │ ├── js │ │ ├── hello-world │ │ │ ├── blank-project.png │ │ │ ├── build-project.png │ │ │ ├── chrome-output.png │ │ │ ├── create-new-project.png │ │ │ ├── creating-mainkt.png │ │ │ ├── name-project.png │ │ │ ├── output-files.png │ │ │ └── target-kotlin-javascript.png │ │ ├── working-with-the-dom-part1 │ │ │ ├── output1.png │ │ │ ├── output2.png │ │ │ ├── output3.png │ │ │ ├── output4.png │ │ │ ├── output5.png │ │ │ ├── output6.png │ │ │ ├── output7.png │ │ │ ├── output8.png │ │ │ └── output9.png │ │ └── working-with-the-dom-part3 │ │ │ ├── IDE-workspace.png │ │ │ ├── add-as-library.png │ │ │ ├── bitnary-download.png │ │ │ ├── choose-categories-of-selected-files.png │ │ │ ├── dl-bitnary-link.png │ │ │ ├── kotlinx-download.png │ │ │ ├── lib-contains.png │ │ │ └── link-of-others-kotlinx-version.png │ └── posts │ │ ├── 2017-4-4-kotlin-native-tech-preview-kotlin-without-a-vm │ │ └── kotlin-native.png │ │ ├── 2017-5-17-kotlin-on-android-now-official │ │ └── android_kotlin.png │ │ ├── 2018-5-1-running-restful-app-with-spring-boot-and-kotlin │ │ ├── kotlin-spring-boot-restful-web-service.jpg │ │ ├── new-project.png │ │ ├── new-project2.png │ │ ├── new-project3.png │ │ └── tree.png │ │ ├── 2019-05-24-new-kotlinfarsi │ │ ├── edit-github-btn.png │ │ ├── kotlinfarsi-back-full.jpg │ │ ├── radio-kotlin-farsi.png │ │ ├── try-it.png │ │ └── tutorials.png │ │ └── 2019-06-24-kotlin-everywhere-report │ │ ├── Ktor.odp │ │ ├── injori.jpg │ │ ├── keyvan-esbati-kotlin-dsl.jpg │ │ ├── kotlin-farsi-year-plan.png │ │ ├── sina-darvishi-keynote.jpg │ │ ├── sina-darvishi-kotlinjs.jpg │ │ ├── sina-rezayi-ktor.jpg │ │ └── vahid-mavaji-functional.jpg ├── js │ ├── easybook.js │ └── persiandate │ │ ├── moment-jalaali.js │ │ └── moment.js └── profile │ └── sina_darvishi.jpg ├── category.html ├── feed.xml ├── index.html ├── kotlinfarsi-new.svg ├── kotlinfarsi.png ├── radio.md ├── serve ├── try.html └── tutorials.html /.gitignore: -------------------------------------------------------------------------------- 1 | _site 2 | .sass-cache 3 | .c9 4 | Gemfile.lock 5 | .idea 6 | !/_site/_redirects 7 | -------------------------------------------------------------------------------- /404.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | title: Page Not Found 4 | permalink: /404.html 5 | nocomments: true 6 | public: false 7 | --- 8 | 9 | Seems disappeared :( 10 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | gem 'github-pages', group: :jekyll_plugins 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # KotlinFarsi-WebSite 2 |
3 | سایت جدید کاتلین فارسی ، قدرت گرفته با Jekyll 4 | 5 | 6 | 7 | ## ویژگی ها 8 | 9 | - صفحه جدید **رادیو کاتلین**، مصاحبه هایی که با افراد موفق انجام میشود در این صفحه قرار میگیرد 10 | - دوره های **رایگان** آموزشی در سایت نیز قرار گرفت. 11 | - مقاله های خبری، آموزشی نیز در سایت قرار میگیرد و همچنین افراد مختلف که خواهان درج مقاله خود هستند نیز **میتوانند** مقاله ی خود را به نام خود به اشتراک بگذارند. 12 | - صفحه **کاتلین رو امتحان کن** نیز به افراد تازه وارد این امکان را میدهد که بدون نصب چیزی تنها در مرورگر بتوانند کاتلین را امتحان کنند. 13 | 14 | 15 | 16 | ## نحوه مشارکت 17 | 18 | برای مشارکت کافی است این مخزن را clone کرده و تغییرات خود را در آن وارد و سپس به صورت pull-request درخواست دهید. 19 | 20 | 21 | 22 | ## چگونه دوره خود را در کاتلین فارسی ایجاد کنم 23 | 24 | شما میتوانید دوره ی خود را درکاتلین فارسی قرار دهید و آن را چه به صورت رایگان و چه با پرداخت هزینه در اختیار دیگران قرار دهید. برای قرار دادن دوره خود کافی است یک **استاد** شوید. میتوانید به صورت مستقیم در توییتر و یا تلگرام و یا به صورت ایمیل درخواست خود را مطرح نمایید. 25 | 26 |
27 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | # Site settings 2 | title: کاتلین فارسی 3 | url: "https://kotlinfarsi.com" 4 | baseurl: "" 5 | description: > 6 | مرجع متن باز کاتلین به زبان فارسی 7 | 8 | email: kotlinfarsi@gmail.com 9 | author: کاتلین فارسی 10 | avatar: "kotlinfarsi.png" 11 | twitter_username: "@kotlinfarsi" 12 | github_username: "@kotlinfarsi" 13 | profile_links: 14 | Email: "kotlinfarsi@gmail.com" 15 | GitHub: "https://github.com/kotlinfarsi" 16 | 17 | # Comment Service 18 | #disqus_shortname: xxx # get one: https://disqus.com/admin/signup/ 19 | 20 | excerpt_separator: 21 | github_editlink: https://github.com/KotlinFarsi/KotlinFarsi-WebSite/edit/master/ 22 | 23 | header: 24 | links: 25 | دوره ها: /tutorials/ 26 | مقاله ها: / 27 | گیتهاب: https://github.com/kotlinfarsi 28 | رادیو کاتلین: https://kotlinfarsi.github.io/radio-website/ 29 | کاتلین رو امتحان کن: /try/ 30 | 31 | 32 | permalink: /archivers/:title 33 | plugins: 34 | - jekyll-paginate 35 | - jekyll-gist 36 | - jemoji 37 | 38 | # Build settings 39 | paginate: 5 40 | paginate_path: "page:num" 41 | 42 | highlighter: rouge 43 | markdown: kramdown 44 | 45 | # https://jekyllrb.com/docs/configuration/#precedence 46 | defaults: 47 | - 48 | scope: 49 | path: "" 50 | type: "posts" 51 | values: 52 | layout: "post" 53 | 54 | kramdown: 55 | input: GFM 56 | syntax_highlighter: rouge 57 | math_engine: mathjax 58 | 59 | collections: 60 | tutorials: 61 | output: true 62 | permalink: /tutorials/:categories/:name 63 | -------------------------------------------------------------------------------- /_includes/comment.html: -------------------------------------------------------------------------------- 1 | {% if page.nocomments %} 2 | {% else %} 3 | {% if site.disqus_shortname %} 4 |
5 |
6 | 14 |
15 | {% endif %} 16 | {% if site.duoshuo_shortname %} 17 |
18 |
19 | 30 |
31 | {% endif %} 32 | {% endif %} 33 | -------------------------------------------------------------------------------- /_includes/edit-on-github.html: -------------------------------------------------------------------------------- 1 |
2 | 5 | 6 |
ویرایش
7 |
8 |
-------------------------------------------------------------------------------- /_includes/footer.html: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /_includes/head.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | {% if page.title %}{{ page.title }} « {{ site.title }}{% else %}{{ site.title }}{% endif %} 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /_includes/header.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 5 | 6 | Kotlin Farsi Logo 7 | 8 | 14 |
15 |
16 | -------------------------------------------------------------------------------- /_includes/post-item.html: -------------------------------------------------------------------------------- 1 |
  • 2 |

    3 | {{ post.title }} 4 |

    5 | 6 |
    7 |
    نویسنده : {{ post.author }}
    8 | 9 |
    10 | {% if post.content contains site.excerpt_separator or post.content != post.excerpt %}{{ post.excerpt }} 11 | {% else %}{{ post.content | lstrip | split: " 12 | " | first }}{% endif %} 13 |

    14 | خواندن مطلب » 15 |

    16 |
    17 | 23 |
  • -------------------------------------------------------------------------------- /_includes/sidebar.html: -------------------------------------------------------------------------------- 1 | {% if page.layout == "tutorial" %} 2 |
    3 |

    فهرست

    4 | {% assign posts = site.tutorials | where: "category", {{page.category}} %} 5 | {% assign posts_by_unit = posts | sort: "unit" | group_by: "unit" %} 6 | {% for unit in posts_by_unit %} 7 | {% assign sorted_unit_posts = unit.items | sort: "chapter" %} 8 | {% for post in sorted_unit_posts %} 9 | {% assign justContent = post.content | strip %} 10 | {% if post.chapter == 0 %} 11 |

    12 | {% capture linkText %}{{post.unit}} - {{post.title}}{% endcapture %} 13 | {% if justContent != blank %} 14 | {{linkText}} 15 | {% else %} 16 | {{linkText}} 17 | {% endif %} 18 |

    19 | {% else %} 20 |

    21 | {% capture linkText %}{{post.chapter}}.{{post.unit}} {{ post.title }}{% endcapture %} 22 | {% if justContent != blank %} 23 | {{ linkText }} 24 | {% else %} 25 | {{ linkText }} 26 | {% endif %} 27 |

    28 | {% endif %} 29 | {% for sub_header in post.sub_headers %} 30 |

    31 | {% capture linkText %}- {{ sub_header }}{% endcapture %} 32 | {% capture sub_header_link %}{{ post.url }}#{{ sub_header | replace: " ", "-"}}{%endcapture%} 33 | {% if justContent != blank %} 34 | {{ linkText }} 35 | {% else %} 36 | {{ linkText }} 37 | {% endif %} 38 |

    39 | {% endfor %} 40 | 41 | {% endfor %} 42 | {% endfor %} 43 |
    44 | {% endif %} 45 | 46 | {% if page.layout == "post" %} 47 | 56 | {% endif %} -------------------------------------------------------------------------------- /_layouts/default.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {% include head.html %} 5 | 6 | 7 | 8 | {% include header.html %} 9 | 10 |
    11 |
    12 |
    13 | {% include sidebar.html %} 14 |
    15 |
    16 | {{ content }} 17 |
    18 |
    19 |
    20 | 21 | {% include footer.html %} 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /_layouts/jetpack-content-page.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {% include head.html %} 5 | 6 | 7 | 8 | {% include header.html %} 9 | 10 |
    11 |
    12 |
    13 | {% include sidebar.html %} 14 |
    15 |
    16 | {{ content }} 17 |
    18 |
    19 |
    20 | 21 | {% include footer.html %} 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /_layouts/page.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | --- 4 |
    5 | 6 |
    7 |

    {{ page.title }}

    8 |
    9 | 10 |
    11 | {{ content }} 12 |
    13 | 14 | {% include comment.html %} 15 | 16 |
    17 | -------------------------------------------------------------------------------- /_layouts/post.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | --- 4 |
    5 | 6 |
    7 |

    {{ page.title }}

    8 |
    9 | 10 | 11 | ویرایش 12 | 13 |
    14 |
    15 | 16 | 19 |
    20 | 21 | 22 |
    23 | 24 | 30 | 31 |
    32 | {{ content }} 33 |
    34 | 35 | {% include comment.html %} 36 | 37 |
    38 | -------------------------------------------------------------------------------- /_layouts/tutorial.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | --- 4 | 5 |
    6 | 7 |
    8 |

    {{ page.title }}

    9 | {% include edit-on-github.html %} 10 |
    11 | 12 | 13 |
    14 | {{ content }} 15 |
    16 | 17 | {% include comment.html %} 18 | 19 | 20 | 21 |
    22 | -------------------------------------------------------------------------------- /_plugins/markdown.rb: -------------------------------------------------------------------------------- 1 | module Jekyll 2 | class MarkdownBlock < Liquid::Block 3 | def initialize(tag_name, text, tokens) 4 | super 5 | end 6 | require "kramdown" 7 | def render(context) 8 | content = super 9 | "#{Kramdown::Document.new(content).to_html}" 10 | end 11 | end 12 | end 13 | Liquid::Template.register_tag('markdown', Jekyll::MarkdownBlock) 14 | 15 | # this function will force html tags to support Markdown, so out text is not inherit from normal htmls 16 | # and we can now use "rtl" tag -------------------------------------------------------------------------------- /_posts/2017-4-18-use-kotlin-with-npm-webpack-and-react/2017-4-18-use-kotlin-with-npm-webpack-and-react.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "استفاده از کاتلین به همراه npm، webpack و react" 4 | date: 2017-04-18 00:00:00 5 | categories: post 6 | editlink: https://github.com/KotlinFarsi/KotlinFarsi-WebSite/edit/master/_posts/2017-4-18-use-kotlin-with-npm-webpack-and-react/2017-4-18-use-kotlin-with-npm-webpack-and-react.md 7 | author: "سینا درویشی" 8 | profilepic: /assets/profile/sina_darvishi.jpg 9 | --- 10 | 11 |
    12 | 13 | > *این صفحه صرفا ترجمه شده [این مقاله](https://blog.jetbrains.com/kotlin/2017/04/use-kotlin-with-npm-webpack-and-react/) میباشد* 14 | 15 | 16 | 17 | همینطور که میدونید در نسخه 1.1 کاتلین، قابلیت نوشتن کد کاتلین و کامپایل به جاوا اسکریپت ممکن شد. البته که داشتن پشتیبانی کامپایلر به تنهایی نمیتونه مشکلاتی که در واقعیت بهش میخوریم رو برطرف کنه، بنابراین درنظر این شدیم که کاتلین رو به داخل اکوسیستم های بزرگتری وارد کنیم. 18 | 19 | امروز مفتخریم که دو پروژه جدید رو برای شما پرزنت کنیم: یک پلاگین Gradle که کاتلین رو همراه npm و webpack و Karma کرده و یک برنامه نمونه full-stack که در بک اند از Kotlin/JVM استفاده میکنه و از Kotlin/JS برای React در فرانت اند استفاده میکنه. 20 | 21 | 22 | 23 | **پلاگین فرانت اند کاتلین:** 24 | 25 | [پلاگین فرانت اند کاتلین](https://github.com/Kotlin/kotlin-frontend-plugin) این امکان رو میده که بتونیم یک برنامه فرانت اند کاتلین رو به کمک webpack بسازیم و دیپلوی کنیم همچنین میتونیم پکیج های npm رو به صورت وابستگی یک برنامه اجرا کنیم و سپس پلاگین مسئولیت دانلود و به همراه کردن اونها برای ساختن فایل JS دلخواه به عهده میگیره. همچنین برای بهبود کاربری این پلاگین کامپایل های پشت سر هم و hot-reload رو نیز انجام میده که بتونیم همواره اخرین ورژن از برنامه رو در مرورگر خودمون ببینیم. 26 | 27 | فایل [README](https://github.com/Kotlin/kotlin-frontend-plugin/blob/master/README.md) به شما نحوه استفاده از این پلاگین رو نشون میده و همچنین فولدر سمپیل شامل [نمونه های ساده](https://github.com/Kotlin/kotlin-frontend-plugin/tree/master/examples/frontend-only) است که به شما نحوه اجرا برروی برنامه های واقعی رو نشون میده. 28 | 29 | 30 | 31 | **مثال Kotlin-React :** 32 | 33 | [Thinkter](https://github.com/Kotlin/kotlin-fullstack-sample) یک نمونه برنامه full-stack هه که به صورت کامل با Kotlin پیاده سازی شده. بک اند تحت Jetty اجرا میشه و از [Ktor](https://github.com/kotlin/ktor) استفاده میکنه که یک فریمورک وب کاتلینه که توسط تیم کاتلین توسعه داده شده. فرانت اند از React استفاده میکنه. شما میتونید از این Wrapper ها استفاده کنید و یا به دلخواه خودتون تغییرشون بدین. 34 | 35 | برای این که ببنید کد React-Kotlin چگونه کار میکنه، میتونید [یک کامپوننت](https://github.com/Kotlin/kotlin-fullstack-sample/blob/master/frontend/src/org/jetbrains/demo/thinkter/NewThoughtComponent.kt) برنامه رو ببینید. 36 | 37 | برای آشنا شدن با نحوه عملکرد Kotlin/JS میتونید [دوره مرورگر کاتلین فارسی](https://kotlinfarsi.com/courses/) رو مشاهده کنید. 38 | 39 |
    40 | -------------------------------------------------------------------------------- /_posts/2017-4-6-kotlin-1-1-event-report/2017-4-6-kotlin-1-1-event-report.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "گزارش مراسم کاتلین 1.1" 4 | date: 2017-04-06 00:00:00 5 | categories: post 6 | editlink: https://github.com/KotlinFarsi/KotlinFarsi-WebSite/edit/master/_posts/2017-4-6-kotlin-1-1-event-report/2017-4-6-kotlin-1-1-event-report.md 7 | author: "سینا درویشی" 8 | profilepic: /assets/profile/sina_darvishi.jpg 9 | --- 10 | 11 |
    12 | 13 | > *این صفحه صرفا ترجمه شده [این مقاله](https://blog.jetbrains.com/kotlin/2017/04/kotlin-1-1-event-report/) میباشد* 14 | 15 | انتشار نسخه 1.1 کاتلین به گرمی توسط جامعه کاتلین پذیرفته شد. برای شرح دادن ویژگی های جدید در کاتلین 1.1 ، Jetbrains پیشنهاد برگزاری یک مراسم آنلاین رو داد. افراد مشتاق قادر بودن که استریم پرزنت آندری(Andrey Breslav) رو به صورت زنده ببینند و سوال هاشون در جلسه Q&A پاسخ داده میشد. 16 | 17 | تمام انجمن ها تشویق شدن که یک دورهمی برگزار کنند. بیش از 30 گروه در 21 کشور جهان میزبان مراسم های دورهمی کاتلین شدند. 18 | 19 | شما میتونید لیست تمام اونت ها رو در [صفحه جامعه کاتلین](http://kotlinlang.org/community/talks.html?time=kotlin) ببینین. بیش از 3000 نفر پخش زنده رو مشاهده کردند. 20 | 21 | ویدیو پرزنت آندری و Q&A در سایت آپارات قابل مشاهده است. 22 | 23 |
    24 | 25 |
    26 | 27 |
    28 | 29 | 30 | **فیدبک مراسم کاتلین 1.1 :** 31 | 32 | در این مراسم از بیننده گان درخواست شد که نظرات خودشون رو در مورد کاتلین 33 | 34 | بیان کنند. شما نیز میتونید فیدبک خودتون رو [در این فرم پر کنید](https://docs.google.com/forms/d/e/1FAIpQLSdgKsJzwc1ToAusi-xpEiiE1O4t3HA5xjlbZXDU5Mg0i3qvNg/viewform). نظرات شما باعث بهبود ویژگی های کاتلین میشه. 35 | 36 |
    37 | -------------------------------------------------------------------------------- /_posts/2017-5-12-kotlin-native-v0-2-is-out/2017-5-12-kotlin-native-v0-2-is-out.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "کاتلین/نیتیو v0.2 بیرون آمد!" 4 | date: 2017-05-12 00:00:00 5 | categories: post 6 | editlink: https://github.com/KotlinFarsi/KotlinFarsi-WebSite/edit/master/_posts/2017-5-12-kotlin-native-v0-2-is-out/2017-5-12-kotlin-native-v0-2-is-out.md 7 | author: "سینا درویشی" 8 | profilepic: /assets/profile/sina_darvishi.jpg 9 | --- 10 | 11 |
    12 | 13 | > *این صفحه صرفا ترجمه شده [این مقاله](https://blog.jetbrains.com/kotlin/2017/05/kotlinnative-v0-2-is-out/) میباشد* 14 | 15 | 16 | > *یادآور شویم که در حال حاضر کاتلین نیتیو ورژن بالاتری را دارا است* 17 | 18 | 19 | 20 | ما خیلی خوشحالیم که اعلام کنیم کاتلین/نیتیو 0.2 منتشر شده است که به همراه یک ویژگی و فیکس شدن باگ های [بررسی تکنولوژی کاتلین نیتیو]() آمده است. در این آپدیت coroutines و توابع بین خطی cross-module ساپورت شده است و همچنین بسیاری از باگ ها اصلاح شده و بسیاری بهبود سازی صورت گرفته است. 21 | 22 | این انتشار شامل تعدادی مثال مفید است که به عنوان مثال نحوه استفاده از coroutine ها در concourent non-blocking I/O توضیح داده شده و یا سورس [یک برنامه با رابط کاربری ساخته شده با GTK](https://github.com/JetBrains/kotlin-native/tree/master/samples/gtk) مثال زده شده است و همچنین [یک کلاینت یادگیری ماشین TensorFlow](https://github.com/JetBrains/kotlin-native/tree/master/samples/tensorflow) نیز مثال زده شده است. 23 | 24 | به عنوان مثال، کد ساده ای مثل زیر: 25 | 26 |
    27 | 28 | ```kotlin 29 | var connectionId = 0 30 | acceptClientsAndRun(listenFd) { 31 | memScoped { 32 | val bufferLength = 100L 33 | val buffer = allocArray(bufferLength) 34 | val connectionIdString = "#${++connectionId}: ".cstr 35 | val connectionIdBytes = connectionIdString.getPointer(this) 36 | try { 37 | while (true) { 38 | val length = read(buffer, bufferLength) 39 | if (length == 0L) break 40 | write(connectionIdBytes, connectionIdString.size.toLong()) 41 | write(buffer, length) 42 | } 43 | } catch (e: IOException) { 44 | println("I/O error occurred: ${e.message}") 45 | } 46 | } 47 | } 48 | ``` 49 | 50 |
    51 | 52 | میتونه در پردازش چندین Socket I/O ی همزمان با استفاده از coroutine ها و خدمت دادن به همه کلاینت ها به صورت کاملا مستقل و همزمان استفاده بشه! 53 | 54 | و همچنین برای ساختن یک دکمه GTK به همراه یک event Listener، میشه اینجوری کد زد: 55 | 56 |
    57 | 58 | 59 | ```kotlin 60 | val button = gtk_button_new_with_label("Click me!")!! 61 | g_signal_connect(button, "clicked", 62 | staticCFunction { _: CPointer?, _: gpointer? -> println("Hi from Kotlin")} 63 | ) 64 | ``` 65 | 66 |
    67 | 68 | بنابراین با استفاده از ورژن 0.2 میشه برنامه های ساده نوشته شده با کاتلین رو پیاده سازی کنید. 69 | 70 | هم زمان تایم کامپایل و هم عملکرد در زمان اجرا به شدت بهبود پیدا کرده است و همچنین سایز بازنشردهنده (redistributable) نیز کاهش پیدا کرده است. 71 | 72 | لیست تغییرات این انتشار رو میتونید در [changelog](https://github.com/JetBrains/kotlin-native/blob/v0.2.0/CHANGELOG.md) ببینید. 73 | 74 | همچنین فایل های باینری از قبل کامپایل شده برای [Linux](http://download.jetbrains.com/kotlin/native/kotlin-native-linux-0.2.tar.gz) و [MacOS](http://download.jetbrains.com/kotlin/native/kotlin-native-macos-0.2.tar.gz) نیز در دسترس است. 75 | 76 |
    77 | -------------------------------------------------------------------------------- /_posts/2019-06-02-kotlin-weekly-148/2019-06-02-kotlin-weekly-148.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "هفته نامه کاتلین - شماره 148" 4 | date: 2019-06-02 00:00:00 5 | categories: post 6 | editlink: https://github.com/KotlinFarsi/KotlinFarsi-WebSite/edit/master/_posts/2019-06-02-kotlin-weekly-148/2019-06-02-kotlin-weekly-148.md 7 | author: "سینا درویشی" 8 | profilepic: /assets/profile/sina_darvishi.jpg 9 | --- 10 | 11 |
    12 | 13 | یکی از سایت هایی محبوب در زمینه کاتلین، [هفته نامه کاتلین](http://kotlinweekly.net/) اهه. که بعد از عضویت به صورت هفتگی از آپدیت ها، ویژگی ها و تازه ها با خبر میشید. حالا ما هم در کاتلین فارسی انشالا اگه مشکلی پیش نیاد، شما رو از تازه های کاتلین باخبر میکنیم. همراهمون باشید. 14 | 15 | 16 | 17 | ## [ورژن 2 کتابخانه Koin](https://100androidquestionsandanswers.us12.list-manage.com/track/click?u=f39692e245b94f7fb693b6d82&id=ff78f51d61&e=9da6128bd8) 18 | 19 | ورژن دوم کتابخانه Koin به صورت پایدار و رسمی منتشر شد. بعد از شش ماه توسعه، بازنویسی، نوسازی API و فیدبک های کاربران این نسخه منتشر شد. مقاله ای که در مورد ویژگی ها و اخبار جدید صحبت کرده رو بخونید. 20 | 21 | 22 | 23 | ## [دیباگ کامپایلر کاتلین/Native](https://100androidquestionsandanswers.us12.list-manage.com/track/click?u=f39692e245b94f7fb693b6d82&id=efedb0a79c&e=9da6128bd8) 24 | 25 | برای اضافه کردن generic ها به هدر خروجی کاتلین/نیتیو، Kevin Galligan مجبور شده کاتلین/نیتیو رو با استفاده از یک debugger مهندسی معکوس کنه. 26 | 27 | 28 | 29 | ## [ازبین بردن Coroutine leaks در تست ها](https://100androidquestionsandanswers.us12.list-manage.com/track/click?u=f39692e245b94f7fb693b6d82&id=559a91c961&e=9da6128bd8) 30 | 31 | مبحث Coroutine ها خیلی توی بورس افتاده و اگر شما درحال نوشتن coroutine ای هستید، شاید بخواین براش تست ای هم بنویسید. نوشتن تست برای coroutine ها میتونه سخت باشه، نه تنها به خاطر concurrency بلکه ممکنه leak هایی رو در یک تست به صورت منفرد به وجود اورده باشید. 32 | 33 | 34 | 35 | ## [Kotlin Destructuring Declarations and ComponentN](https://100androidquestionsandanswers.us12.list-manage.com/track/click?u=f39692e245b94f7fb693b6d82&id=94a9f11709&e=9da6128bd8) 36 | 37 | در این مقاله Rafael Monreno توضیح میده چطور میشه Declaration ها رو تجزیه کرد و نگاهی به دو جا میندازه که این سینتکس تجزیه میتونه مفید باشه. 38 | 39 | 40 | 41 | ## [چطور توسعه برنامه های اندروید، Kotlin-First شد؟](https://100androidquestionsandanswers.us12.list-manage.com/track/click?u=f39692e245b94f7fb693b6d82&id=3807442fbd&e=9da6128bd8) 42 | 43 | در کنفرانس سالانه توسعه دهندگان I/O ، گوگل بیان کرد که کاتلین زبانی با پشتیبانی اولیه برای توسعه اندروید شده. ولی چی شد که تصمیم به ترک Java گرفتن؟ و چی شد که اهمیت کاتلین از جاوا پیشی گرفت؟ 44 | 45 |
    46 | -------------------------------------------------------------------------------- /_posts/2019-06-09-kotlin-weekly-149/2019-06-09-kotlin-weekly-149.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "هفته نامه کاتلین - شماره 149" 4 | date: 2019-06-09 00:00:00 5 | categories: post 6 | editlink: https://github.com/KotlinFarsi/KotlinFarsi-WebSite/edit/master/_posts/2019-06-09-kotlin-weekly-149/2019-06-09-kotlin-weekly-149.md 7 | author: "سینا درویشی" 8 | profilepic: /assets/profile/sina_darvishi.jpg 9 | --- 10 | 11 |
    12 | 13 | یکی از سایت هایی محبوب در زمینه کاتلین، [هفته نامه کاتلین](http://kotlinweekly.net/) اهه. که بعد از عضویت به صورت هفتگی از آپدیت ها، ویژگی ها و تازه ها با خبر میشید. حالا ما هم در کاتلین فارسی انشالا اگه مشکلی پیش نیاد، شما رو از تازه های کاتلین باخبر میکنیم. همراهمون باشید. 14 | 15 | 16 | 17 | ## [استفاده از کلیدواژه synchronized در Coroutines](https://jacquessmuts.github.io/post/coroutine_sync_mutex/) 18 | 19 | کار کردن با coroutines مقداری با تابع های locking معمولی فرق داره. برای این که یاد بگیرید چگونه coroutines را به صورت thread-safe استفاده کنید به مقاله بالا مراجعه کنید. 20 | 21 | 22 | 23 | ## [Kotlin Smart Casting By Immutability](https://brunoaybar.com/kotlin-smart-casting) 24 | 25 | زمانی که کاتلین مینویسید، در اکثر مواقع لازم نیست که type ها رو به صورت صریح بیان کنید زیرا که سیستم Type کاتلین به اندازه ای هوشمند است که خودش متوجه بشه. این مقاله در مورد این موضوع بیشتر توضیح میده. 26 | 27 | 28 | 29 | ## [Execution context of Kotlin Flows](https://medium.com/@elizarov/execution-context-of-kotlin-flows-b8c151c9309b) 30 | 31 | در خیلی از مواقع زمینه اجرای کد مهمه. به عنوان مثال در اپلیکیشن های دارای UI(مثل موبایل)، اون widget ها تنها زمانی میتونن لمس بشن در thread اصلی باشن. این میتونه باعث ایجاد مشکل بشه وقتی کدتون بزرگتر شد، مخصوصا زمانی که سعی کنید تولید کننده دیتا و مصرف کننده دیتا رو از هم جدا کنید. Flow ها در کاتلین طراحی شدن برای همین مشکل! 32 | 33 | 34 | 35 | ## [تحلیل و تجزیه کلاس های Sealed شده در کاتلین](https://arturdryomov.online/posts/abstracting-kotlin-sealed-classes/) 36 | 37 | یکی از نمود های کاتلین کلاس های sealed شده است که میتونیم بگیم در اکثر مواقع به درستی استفاده نمیشن. 38 | 39 | ## [Class delegation in Kotlin](https://hackernoon.com/kotlin-what-is-class-delegation-all-about-683eb543e391) 40 | 41 | کیوان در این مقاله در مورد مزایای الگوی Delegation صحبت میکنه و سپس به بررسیش در کاتلین میپردازه. 42 | 43 |
    -------------------------------------------------------------------------------- /_posts/2019-06-24-kotlin-everywhere-report/2019-06-24-kotlin-everywhere-report.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "گزارش مراسم KotlinEverywhere" 4 | date: 2019-06-24 00:00:00 5 | categories: post 6 | editlink: https://github.com/KotlinFarsi/KotlinFarsi-WebSite/edit/master/_posts/2019-06-24-kotlin-everywhere-report/2019-06-24-kotlin-everywhere-report.md 7 | author: "سینا درویشی" 8 | profilepic: /assets/profile/sina_darvishi.jpg 9 | --- 10 | 11 |
    12 | 13 | # گزارش مراسم KotlinEverywhere 14 | 15 |

    16 | 17 |

    18 | 19 | 20 | پنج شنبه هفته گذشته اولین مراسم KotlinEverywhere به لطف بچه های [Logcat](https://irlogcat.ir/) برگزار شد. در ابتدا keynote این مراسم توسط سینا درویشی ارائه شد و از برنامه های کاتلین فارسی در طی سال جاری خبر داد. 21 | 22 | 23 |

    24 | 25 |

    26 | 27 | 28 | 29 | ## برنامه نویسی Functional 30 | 31 |

    32 | 33 |

    34 | 35 | اولین ارائه توسط وحید مواجی درمورد برنامه نویسی Functional در کاتلین پرزنت شد. ارائه جالبی که در اون ویژگی های یک زبان Functional توضیح داده شد و سپس با ارائه مثال تفاوت های زبان کاتلین، هسکل و اسکالا در برنامه نویسی Functional شرح داده شد. برای اطلاعات بیشتر میتونید به مثال هاش در [رپوی گیتهابش](https://github.com/mavaji/ke2019) سربزنید (استار یادتون نره!) 36 | 37 | 38 | 39 | ## توسعه بک اند به کمک Ktor 40 | 41 |

    42 | 43 |

    44 | 45 | دومین ارائه توسط سینا رضایی درمورد توسعه بک اند بود. توی این ارئه جذاب، سینا ابتدا در مورد Ktor صحبت کرد، سپس Ktor رو با چند فریم ورک جاوایی و غیر جاوایی مقایسه کرد. سپس چند مثال از نحوه پیاده سازی و توانایی های Ktor زد. اسلاید های ارائه سینا رو میتونید از [اینجا](\assets\img\posts\2019-06-24-kotlin-everywhere-report\Ktor.odp) دانلود کنید. 46 | 47 | 48 | 49 | ## ساخت UI با استفاده از Kotlin DSL ها 50 | 51 |

    52 | 53 |

    54 | 55 | سومین ارائه توسط کیوان اثباتی درباره ساخت UI ها به روشی متفاوت در اندروید بود. روشی که چندی پیش توسط شرکت Jetbrains با ارائه کتابخانه Anko معرفی شد و روش نوین دیگری که Google با معرفی Jetpack Compose ارائه کرد. اسلاید های ارائه کیوان رو میتوید در [اینجا](https://docs.google.com/presentation/d/1oZGGD-UH_0C8THVjvjpQwU_xNlkLW0v_u3pT-Cz9LBs/edit?usp=sharing) ببینید. 56 | 57 | 58 | 59 | ## استفاده از Kotlin برای مرورگر 60 | 61 |

    62 | 63 |

    64 | 65 | آخرین ارائه توسط سینا درویشی درمورد نحوه استفاده از Kotlin/JS بود. در این ارائه سینا نحوه استفاده از Kotlin/JS برای سمت کلاینت رو توضیح داد و سپس فریمورک Kotlin-React رو معرفی کرد و با استفاده از اون و تنها آموزش های خود React سعی به پیاده سازی دو نمونه پروژه کرد. [بازی دوز](https://github.com/sinadarvi/tic-tac-toe) و [ترجمه گر فینگلیش به فارسی](https://github.com/sinadarvi/what-am-i-saying) 66 | 67 | 68 | 69 | ## حضور بچه های [#اینجوری](http://injouri.ir/) 70 | 71 | بچه های اینجوری هم لطف داشتن و با محیا کردن استیکرهای کاتلین، جمع کاتلینی ما رو، پر رنگ تر کردن. 72 | 73 |

    74 | 75 |

    76 | 77 | در انتها از تمامی دوستانی که در این مراسم حضور داشتن و همراه ما بودن کمال تشکر رو میکنیم، مخصوصا بچه های تیم logcat ای که بدون اونا این مراسم برگزار نمیشد. انشالا در مراسم بعدی KotlinEverywhere هم شاهد حضور گرمتون باشیم. 78 | 79 | 80 |
    81 | 82 | -------------------------------------------------------------------------------- /_posts/2019-08-05-just-a-simple-repo/2019-08-05-just-a-simple-repo.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "یک مخزن ساده!" 4 | date: 2019-08-05 00:00:00 5 | categories: post 6 | editlink: https://github.com/KotlinFarsi/KotlinFarsi-WebSite/edit/master/_posts/2019-08-05-just-a-simple-repo/2019-08-05-just-a-simple-repo.md 7 | author: "سینا درویشی" 8 | profilepic: /assets/profile/sina_darvishi.jpg 9 | --- 10 |
    11 | 12 | همینطور که میدونید در گیتهاب کاتلین فارسی مخزن ها به دو صورت اند: 13 | 14 | - مخزن های آموزشی 15 | - مخزن های پروژه ای 16 | 17 | یکی از پروژه های بنیاد کاتلین فارسی همین سایتی است که میبینین! که در اون مجموعه مخازن آموزشی به صورت آنلاین قابل مطالعه است. در عین حال برای راحتی گروهی از دوستان، مخزن های آموزشی به صورت جداگانه در گیتهاب کاتلین فارسی قرار شده است. 18 | 19 | هر آموزش و هر ویرایشی که بر روی فایل های Markdown داخل مخزن های آموزشی داده میشود برای مشاهده در سایت ابتدا توسط پروژه [kotlinfarsi-markdown-modifier](https://github.com/KotlinFarsi/kotlinfarsi-markdown-modifier) مناسب سازی میشود، سپس بر روی سایت قرار میگیرد. حالا که مدتی زیادی از شروع فعالیت سایت گذشته، نیاز این جامعه به مخزن های آموزشی به صورت جداگانه کم شده است. 20 | 21 | بر این اساس بر نظر شدیم که منابع آموزشی به صورت مخزن های جداگانه نگهداری نشود و از تاریخ **21 مرداد 1398** این مخزن ها به حالت **آرشیو** میروند و البته منظورمون این نیست که منابع آموزشی تهیه نخواهند شد! بلکه مشارکت برروی منابع آموزشی از طریق مشارکت بر روی مخزن سایت ممکن خواهد شد. 22 | 23 | 24 | 25 | ## از دیگر فعالیت هایی که قراره در چند مدت آینده انجام بشه: 26 | 27 | - بعد از آرشیو مخازن آموزشی، به دلیل راحتی دوستانی که مشتاق به همکاری هستن و نحوه و مسیر فعالیتشون، یک سری آموزش های مربوط به نحوه مشارکت در قسمت wiki رپوی سایت (اگه محدود نشیم ایشالا تا اون موقع :) ) قرار داده خواهد شد. این فعالیت انشالا تا 21 مرداد 1398 انجام خواهد شد. 28 | - یکی دیگر از بخش های سایت، پادکست های کاتلین فارسی است. که اتفاقا **اولین پادکستمون** که به همراهی دوست عزیزمون **سید محمد حسین جعفری** هم ضبط شد ولی متاسفانه به دلیل مشفول بودن بنده در سایت قرار داده نشده است. این فعالیت هم تا 25 مرداد 1398 اتفاق میفته. 29 | - یکی از بخش هایی که یکی از دوستان عزیز آقای **علی رضاییان** دارن زحمتش رو میکشن، **آموزش Coroutines به زبان ساده است** که چند قسمتش آماده شده و تا 29 مرداد 1398 هم اون قسمت ها بر روی سایت کاتلین فارسی قرار میدیم. اگر از دوستان کس دیگری هم مشتاق به همکاری بود میتونن کمک علی جان باشن و این آموزش رو کامل کنن. از همینجا ازشون کمال تشکر رو میکنم. 30 | - همینطور که در مراسم KotlinEverywhere گفته شد، تا پایان تابستان قراره قسمت **آموزش پیشرفته کاتلین** نوشته و در سایت قرار داده بشه. که تا یک شنبه 31 شهریور 1398 این کار انجام میشه. 31 | - یک دستی هم به سر و روی سایت کشیده میشه فقط زمانش مشخص نیست انشالا به زودی :)) 32 | 33 | از تموم دوستانی که در این چند مدت همراه کاتلین فارسی بودن ممنونیم، بدونین که کاتلین فارسی یک جامعه است و با افرادی که همراه این جامعه میشن جلو میره لذا لطف و حمایت و همکاری خودتون رو از این جامعه که مجموعه خودتون هستین دریغ نکنین! 34 | 35 | موفق باشید. 36 | -------------------------------------------------------------------------------- /_redirects: -------------------------------------------------------------------------------- 1 | https://kotlinfarsi.ir/* https://kotlinfarsi.com/:splat 301! 2 | https://www.kotlinfarsi.ir/* https://kotlinfarsi.com/:splat 301! 3 | -------------------------------------------------------------------------------- /_sass/_animate.scss: -------------------------------------------------------------------------------- 1 | @keyframes ebani-fadein { 2 | 0% { opacity: 0 } 3 | 100% { opacity: 1 } 4 | } 5 | 6 | @keyframes ebani-descend { 7 | 0% { transform: translateY(-10px); opacity: 0.7; } 8 | 100% { } 9 | } 10 | 11 | @keyframes ebani-ascend { 12 | 0% { transform: translateY(10px); } 13 | 100% { } 14 | } 15 | -------------------------------------------------------------------------------- /_sass/_base.scss: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | font-family: $base-font-family; 4 | font-size: $base-font-size; 5 | line-height: $base-line-height; 6 | } 7 | 8 | p, li, a { 9 | text-align: justify; 10 | } 11 | 12 | a { 13 | text-decoration: none; 14 | color: #036; 15 | } 16 | 17 | a:hover, a:focus { 18 | text-decoration: underline; 19 | color: #069; 20 | } 21 | 22 | blockquote { 23 | background: #f8f8f8; 24 | margin: 0; 25 | padding: 5px 20px; 26 | border-right: 10px solid #f66; 27 | } 28 | 29 | code, pre { 30 | font-family: $code-font-family; 31 | font-size: $code-font-size; 32 | } 33 | 34 | code { 35 | color: #900; 36 | background-color: #fff; 37 | padding: 2px 5px; 38 | border-radius: 5px; 39 | } 40 | 41 | pre { 42 | overflow-x: auto; 43 | padding: 20px 50px; 44 | } 45 | 46 | pre, pre code { 47 | color: #fafafa; 48 | background-color: #223; 49 | } 50 | 51 | pre code { 52 | padding: 0; 53 | } 54 | 55 | div iframe { 56 | margin-right: -30px; 57 | margin-left: -30px; 58 | } 59 | 60 | 61 | p img { 62 | margin-right: -30px; 63 | margin-left: -30px; 64 | width: calc(100% + 60px); 65 | height: 100%; 66 | } 67 | 68 | 69 | .hide { 70 | display: none; 71 | } 72 | 73 | .center { 74 | text-align: center; 75 | } 76 | 77 | table { 78 | border-collapse: collapse; 79 | border-spacing: 0; 80 | margin: 10pt auto; 81 | background: #FFF; 82 | 83 | td, th { 84 | border: 1px solid #CCC; 85 | padding: 5px 15px; 86 | margin: 0; 87 | } 88 | 89 | th { 90 | border-color: #555; 91 | background: #555; 92 | color: #eee; 93 | font-weight: normal; 94 | } 95 | 96 | tr:hover { 97 | background: rgba(255, 255, 0, 0.2); 98 | } 99 | } 100 | 101 | h1, h2, h3, h4, h5, h6 { 102 | font-weight: normal; 103 | } 104 | 105 | .MathJax_SVG_Display, .MathJax_Display, .MJXc-display, .MathJax_PHTML_Display { 106 | overflow-x: auto; 107 | } 108 | -------------------------------------------------------------------------------- /_sass/_easybook.scss: -------------------------------------------------------------------------------- 1 | .page-content .wrapper { 2 | .post-toc { 3 | &>ul { 4 | overflow: auto; 5 | } 6 | } 7 | } 8 | 9 | .util-notify1 { 10 | position: absolute; 11 | z-index: 100; 12 | background: rgba(0,0,0,0.7); 13 | color: #FFF; 14 | padding: 5px 10px; 15 | font-size: 14px; 16 | pointer-events: none; 17 | opacity: 1; 18 | transition: .2s ease; 19 | 20 | &.hidden { 21 | opacity: 0; 22 | display: none; 23 | } 24 | } -------------------------------------------------------------------------------- /_sass/_home.scss: -------------------------------------------------------------------------------- 1 | .home { 2 | .page-heading { 3 | font-size:40px; 4 | font-weight: normal; 5 | margin: 20px; 6 | @include media-query($on-palm) { 7 | margin: 10px; 8 | font-size: 34px; 9 | } 10 | } 11 | .rss-link { 12 | float:right; 13 | text-decoration: none; 14 | border:1px solid; 15 | color: #999; 16 | background: #fff; 17 | font-size: 0.7 * $base-font-size; 18 | padding: 1px 8px; 19 | 20 | &:hover, &:focus { 21 | color: #666; 22 | } 23 | } 24 | .post-list { 25 | margin: 0; 26 | padding: 20px 40px; 27 | list-style: none; 28 | > li { 29 | padding-bottom: 30px; 30 | border-bottom: 1px solid #CCC; 31 | margin-bottom: 30px; 32 | } 33 | .post-title { 34 | font-size: 28px; 35 | font-weight: normal; 36 | margin: 0; 37 | } 38 | .post-meta { 39 | font-size: $small-font-size; 40 | color: #666; 41 | margin: 0 20px; 42 | margin-bottom: .5em; 43 | } 44 | .post-excerpt { 45 | &, * { 46 | font-size: $small-font-size; 47 | padding-top: 0; 48 | padding-bottom: 0; 49 | color: #333; 50 | } 51 | code, pre, pre * { 52 | color: #666; 53 | background-color: #eee; 54 | } 55 | th { 56 | border-color: #ccc; 57 | background-color: #ccc; 58 | } 59 | a { 60 | color: $color-link-hover; 61 | } 62 | img { 63 | display: block; 64 | margin: 1em auto; 65 | max-height: 16em; 66 | opacity: .7; 67 | transition: opacity .3s; 68 | &:hover { 69 | opacity: 1; 70 | } 71 | } 72 | margin: 0 20px; 73 | } 74 | @include media-query($on-palm) { 75 | padding: 10px; 76 | } 77 | } 78 | .pagination { 79 | text-align:center; 80 | text-decoration:none; 81 | color: #666; 82 | margin: 30px 0; 83 | .page_number { 84 | margin:0 30px; 85 | } 86 | .previous,.next { 87 | padding: 10px 20px; 88 | white-space: nowrap; 89 | } 90 | a.previous,a.next { 91 | color: #333; 92 | border-radius: 20px; 93 | border: 1px solid #CCC; 94 | } 95 | a.previous:hover,a.next:hover { 96 | background: #fefefe; 97 | color: #000; 98 | text-decoration:none; 99 | } 100 | } 101 | } -------------------------------------------------------------------------------- /_sass/_post.scss: -------------------------------------------------------------------------------- 1 | .post { 2 | .post-header { 3 | margin: 0 100px; 4 | margin-bottom: 40px; 5 | padding: 20px; 6 | 7 | .post-title { 8 | font-size: 40px; 9 | font-weight: normal; 10 | margin: 0 -100px; 11 | @include media-query($on-palm) { 12 | font-size: 34px; 13 | } 14 | } 15 | 16 | .post-edit-github-btn { 17 | margin-left: -100px; 18 | margin-top: -60px; 19 | float: left; 20 | @include media-query($on-palm) { 21 | display: none; 22 | } 23 | } 24 | 25 | .edit-btn { 26 | background-color: #4CAF50; /* Green */ 27 | border: none; 28 | color: white; 29 | padding: 8px 16px; 30 | display: inline-block; 31 | margin: 4px 2px; 32 | -webkit-transition-duration: 0.4s; /* Safari */ 33 | transition-duration: 0.4s; 34 | cursor: pointer; 35 | border-radius: 15px; 36 | } 37 | 38 | .edit-github-btn { 39 | display: inline-block; 40 | vertical-align: middle; 41 | background-color: white; 42 | color: black; 43 | border: 2px solid #e7e7e7; 44 | text-decoration: none; 45 | } 46 | 47 | .edit-github-btn:hover { 48 | background-color: #e7e7e7; 49 | } 50 | 51 | .edit-github-btn-text { 52 | display: inline-block; 53 | vertical-align: middle; 54 | font-family: Vazir; 55 | text-decoration: none; 56 | } 57 | 58 | .post-meta { 59 | color: #999; 60 | font-size: $small-font-size; 61 | margin-right: -25px; 62 | padding-top: 30px; 63 | } 64 | 65 | @include media-query($on-palm) { 66 | text-align: center; 67 | margin-bottom: 10px; 68 | padding: 10px; 69 | } 70 | } 71 | 72 | .post-content { 73 | color: #333; 74 | 75 | h1, h2, h3, h4, h5, h6 { 76 | color: #000; 77 | } 78 | 79 | h1, h2 { 80 | margin-bottom: 10px; 81 | margin-top: 30px; 82 | } 83 | 84 | h1, h2, h3 { 85 | border-bottom: 1px solid #CCC; 86 | } 87 | 88 | //pre[class="kotlin-code"] { 89 | // margin: 0 30px !important; 90 | // @include media-query($on-palm) { 91 | // margin: 0 10px !important; 92 | // } 93 | //} 94 | // 95 | pre { 96 | margin: 0 -30px; 97 | @include media-query($on-palm) { 98 | margin: 0 -10px; 99 | } 100 | } 101 | 102 | .middle-image { 103 | display: block; 104 | margin-left: auto; 105 | margin-right: auto 106 | } 107 | } 108 | 109 | .post-comments { 110 | padding-top: 30px; 111 | } 112 | } 113 | 114 | .post-index { 115 | .headline { 116 | color: #000; 117 | font-weight: 600; 118 | } 119 | .post-head { 120 | color: #036; 121 | } 122 | .selected { 123 | color: red; 124 | } 125 | } -------------------------------------------------------------------------------- /_sass/_syntax-highlighting.scss: -------------------------------------------------------------------------------- 1 | /* Monokai Theme from https://github.com/richleland/pygments-css/blob/master/monokai.css */ 2 | .highlight { 3 | .hll { background-color: #49483e } 4 | .c { color: #75715e } /* Comment */ 5 | //.err { color: #960050; background-color: #1e0010 } /* Error */ 6 | .k { color: #66d9ef } /* Keyword */ 7 | .l { color: #ae81ff } /* Literal */ 8 | .n { color: #f8f8f2 } /* Name */ 9 | .o { color: #f92672 } /* Operator */ 10 | .p { color: #f8f8f2 } /* Punctuation */ 11 | .cm { color: #75715e } /* Comment.Multiline */ 12 | .cp { color: #75715e } /* Comment.Preproc */ 13 | .c1 { color: #75715e } /* Comment.Single */ 14 | .cs { color: #75715e } /* Comment.Special */ 15 | .ge { font-style: italic } /* Generic.Emph */ 16 | .gs { font-weight: bold } /* Generic.Strong */ 17 | .kc { color: #66d9ef } /* Keyword.Constant */ 18 | .kd { color: #66d9ef } /* Keyword.Declaration */ 19 | .kn { color: #f92672 } /* Keyword.Namespace */ 20 | .kp { color: #66d9ef } /* Keyword.Pseudo */ 21 | .kr { color: #66d9ef } /* Keyword.Reserved */ 22 | .kt { color: #66d9ef } /* Keyword.Type */ 23 | .ld { color: #e6db74 } /* Literal.Date */ 24 | .m { color: #ae81ff } /* Literal.Number */ 25 | .s { color: #e6db74 } /* Literal.String */ 26 | .na { color: #a6e22e } /* Name.Attribute */ 27 | .nb { color: #f8f8f2 } /* Name.Builtin */ 28 | .nc { color: #a6e22e } /* Name.Class */ 29 | .no { color: #66d9ef } /* Name.Constant */ 30 | .nd { color: #a6e22e } /* Name.Decorator */ 31 | .ni { color: #f8f8f2 } /* Name.Entity */ 32 | .ne { color: #a6e22e } /* Name.Exception */ 33 | .nf { color: #a6e22e } /* Name.Function */ 34 | .nl { color: #f8f8f2 } /* Name.Label */ 35 | .nn { color: #f8f8f2 } /* Name.Namespace */ 36 | .nx { color: #a6e22e } /* Name.Other */ 37 | .py { color: #f8f8f2 } /* Name.Property */ 38 | .nt { color: #f92672 } /* Name.Tag */ 39 | .nv { color: #f8f8f2 } /* Name.Variable */ 40 | .ow { color: #f92672 } /* Operator.Word */ 41 | .w { color: #f8f8f2 } /* Text.Whitespace */ 42 | .mf { color: #ae81ff } /* Literal.Number.Float */ 43 | .mh { color: #ae81ff } /* Literal.Number.Hex */ 44 | .mi { color: #ae81ff } /* Literal.Number.Integer */ 45 | .mo { color: #ae81ff } /* Literal.Number.Oct */ 46 | .sb { color: #e6db74 } /* Literal.String.Backtick */ 47 | .sc { color: #e6db74 } /* Literal.String.Char */ 48 | .sd { color: #e6db74 } /* Literal.String.Doc */ 49 | .s2 { color: #e6db74 } /* Literal.String.Double */ 50 | .se { color: #ae81ff } /* Literal.String.Escape */ 51 | .sh { color: #e6db74 } /* Literal.String.Heredoc */ 52 | .si { color: #e6db74 } /* Literal.String.Interpol */ 53 | .sx { color: #e6db74 } /* Literal.String.Other */ 54 | .sr { color: #e6db74 } /* Literal.String.Regex */ 55 | .s1 { color: #e6db74 } /* Literal.String.Single */ 56 | .ss { color: #e6db74 } /* Literal.String.Symbol */ 57 | .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */ 58 | .vc { color: #f8f8f2 } /* Name.Variable.Class */ 59 | .vg { color: #f8f8f2 } /* Name.Variable.Global */ 60 | .vi { color: #f8f8f2 } /* Name.Variable.Instance */ 61 | .il { color: #ae81ff } /* Literal.Number.Integer.Long */ 62 | 63 | .gh { } /* Generic Heading & Diff Header */ 64 | .gu { color: #75715e; } /* Generic.Subheading & Diff Unified/Comment? */ 65 | .gd { color: #f92672; } /* Generic.Deleted & Diff Deleted */ 66 | .gi { color: #a6e22e; } /* Generic.Inserted & Diff Inserted */ 67 | } 68 | -------------------------------------------------------------------------------- /_tutorials/advanced/advanced.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "فهرست" 4 | category: advanced 5 | unit: 6 | chapter: 7 | --- 8 | 9 | 10 |
    11 | 12 | این دوره در حال آماده سازی است. 13 | 14 |
    15 | -------------------------------------------------------------------------------- /_tutorials/android-jetpack/contents.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: jetpack-content-page 3 | title: "فهرست" 4 | category: android-jetpack 5 | unit: 6 | chapter: 7 | --- 8 | 9 | 10 |
    11 | # دوره های Android Jetpack 12 | 13 | با سلام خدمت دوستان اندرویدی عزیز. مجموعه دوره های Jetpack حاصل تلاش تعدادی از دوستان و همکاران کاتلین فارسی است که سعی کردن دوره هایی براساس سمپل های گوگل و شرکت های اساسی دنیای اندروید فراهم کنند تا برخلاف دیگر دوره ها، دوره هایی را دراختیار قرار دهند که براساس اصول و قوائد درست برنامه نویسی اندروید پیاده سازی شده باشند. 14 | 15 | به زودی جدول و حوزه های مورد پوشش این مجموعه در این قسمت قرار خواهند گرفت. تا اون موقع میتونید از اولین دوره تهیه شده ی ما لذت ببرید. 16 | 17 | روز خوبی داشته باشین. 18 | 19 | دوره Room 20 | 21 |
    22 | -------------------------------------------------------------------------------- /_tutorials/android-jetpack/room/adding-comments-to-app.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "اضافه کردن comment ها به برنامه" 4 | category: android-jetpack/room 5 | unit: 6 | chapter: 7 7 | --- 8 | 9 |
    10 | 11 |

    12 | 13 |

    14 | 15 | کد های این قسمت رو میتونید در مرحله 5 [گیتهاب](https://github.com/KotlinFarsi/kf01-BasicSample/tree/Step.05-Solution-Adding-Comments-To-App) پیدا کنید. 16 | 17 |
    -------------------------------------------------------------------------------- /_tutorials/android-jetpack/room/adding-search-feature-and-migration-and-final.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "اضافه کردن ویژگی سرچ به برنامه و Migration و مرحله نهایی" 4 | category: android-jetpack/room 5 | unit: 6 | chapter: 9 7 | --- 8 | 9 |
    10 | 11 |

    12 | 13 |

    14 | 15 |

    16 | 17 |

    18 | 19 | 20 | ## Migration و مرحله نهایی 21 | 22 | 23 |

    24 | 25 |

    26 | کد های این قسمت رو میتونید در مرحله 7 [گیتهاب](https://github.com/KotlinFarsi/kf01-BasicSample/tree/Step.07-Solution-Adding-Search-Feature-And-Final-Part) پیدا کنید. 27 | 28 | 29 | 30 | در انتها لازمه که از شرکت ویرانیکا واسه همکاری و کمک هایی که کردن تشکر کنم. 🙏 31 | 32 | روز خوبی داشته باشید. 33 | 34 | سینا درویشی 35 | 36 |
    -------------------------------------------------------------------------------- /_tutorials/android-jetpack/room/creating-first-dao.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "ساختن اولین DAO" 4 | category: android-jetpack/room 5 | unit: 6 | chapter: 4 7 | --- 8 | 9 |
    10 | 11 | 12 |

    13 | 14 |

    15 | 16 | درحقیقت Data Access Object یک سری آبجکت ان که حاوی یک سری توابع هستن که اون توابع دسترسی مستقیم به دیتابیس دارن. 17 | 18 |

    19 | 20 |

    21 | 22 | ## ساخت ProductDao 23 | 24 |

    25 | 26 |

    27 | برای ساختن ProductDao میتونید از کد زیر استفاده کنید: 28 | 29 |
    30 | 31 | ```kotlin 32 | @Dao 33 | interface ProductDao { 34 | @Query("SELECT * FROM products") 35 | fun loadAllProducts(): LiveData> 36 | 37 | @Query("SELECT * FROM products where id = :productId") 38 | fun loadProduct(productId: Int): LiveData 39 | 40 | @Insert(onConflict = OnConflictStrategy.REPLACE) 41 | fun insertAll(products: List) 42 | } 43 | ``` 44 | 45 | -------------------------------------------------------------------------------- /_tutorials/android-jetpack/room/creating-first-entity.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "ساختن اولین Entity" 4 | category: android-jetpack/room 5 | unit: 6 | chapter: 3 7 | --- 8 | 9 |
    10 | 11 | 12 |

    13 | 14 |

    15 | رسیدیم به Entity ها. همینطور که از اسمشون مشخصه، Entity ها در واقع یک سری موجودیت اطراف ما هستن. از کتاب ها، صندلی ها، میز ها گرفته تا User ها و ... . به عنوان مثال همین User ها میتونن دو شناسه اصلی داشته باشن. `firstName` و `UserName` . 16 | 17 | 18 | 19 |

    20 | 21 |

    22 | 23 | در زبان کاتلین برای ذخیره اطلاعات از دیتا کلاس استفاده میکنیم. 24 | 25 |

    26 | 27 |

    28 | 29 | برای این که به Room بفهمونیم که این کلاسمون میخوایم Entity باشه، از `Entity@` استفاده میکنیم. 30 | 31 |

    32 | 33 |

    34 | 35 | برای این که به Room بگیم، شناسه `id` ما باید PrimaryKey باشه و از این به بعد یونیک در نظرش بگیر باید از `PrimaryKey@` استفاده کنیم. 36 | 37 | 38 | 39 | ## ساخت ProductEntity 40 | 41 |

    42 | 43 |

    44 | 45 | بعد از این که نگاهی به مدل Productامون داشتیم، میتونیم برای ساخت `ProductEntity` از کد زیر استفاده کنیم 46 | 47 |
    48 | 49 | ```kotlin 50 | @Entity(tableName = "products") 51 | data class ProductEntity @JvmOverloads constructor( 52 | @PrimaryKey 53 | override var id: Int? = null, 54 | override var name: String? = null, 55 | override var description: String? = null, 56 | override var price: Int? = null 57 | ) : Product 58 | ``` 59 | 60 | -------------------------------------------------------------------------------- /_tutorials/android-jetpack/room/final-app-and-start-coding.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "بررسی اپلیکیشن نهایی و کد شروع" 4 | category: android-jetpack/room 5 | unit: 6 | chapter: 2 7 | --- 8 | 9 |
    10 | 11 | 12 |

    13 | 14 |

    15 | 16 | 17 | برای شروع کار لازمه که کد شروع رو از این [لینک](https://github.com/KotlinFarsi/kf01-BasicSample/archive/starter-code.zip) دریافت کنید. همینطور میتونید با استفاده از کد زیر به شاخه `starter-code` برین و اونو چک اوت کنین. 18 | 19 |
    20 | 21 | ```bash 22 | git clone https://github.com/KotlinFarsi/kf01-BasicSample 23 | cd ./kf01-BasicSample 24 | git checkout starter-code 25 | ``` 26 | 27 |
    28 | 29 | قبل از این که شروع به خواند کد بکنین، بد نیست نگاهی به اپلیکیشن نهایی بنذازین. 30 | 31 | (عکس) 32 | 33 | 34 | 35 | ## اضافه کردن وابستگی Gradle 36 | 37 |

    38 | 39 |

    40 | 41 | 42 | بعد از این ها، اولین اقدام برای شروع به کار با Room، اضافه کردن دپندنسی زیر به فایل `build.gradle` موجود در فولدر app اه: 43 | 44 |
    45 | 46 | ```groovy 47 | dependencies { 48 | def room_version = "2.2.5" 49 | 50 | implementation "androidx.room:room-runtime:$room_version" 51 | annotationProcessor "androidx.room:room-compiler:$room_version" // For Kotlin use kapt instead of annotationProcessor 52 | 53 | // optional - Kotlin Extensions and Coroutines support for Room 54 | implementation "androidx.room:room-ktx:$room_version" 55 | } 56 | ``` -------------------------------------------------------------------------------- /_tutorials/android-jetpack/room/introduction.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "معرفی دوره" 4 | category: android-jetpack/room 5 | unit: 6 | chapter: 1 7 | --- 8 | 9 |
    10 | با سلام خدمت دوستان عزیز با یک دوره دیگه در خدمتتونیم از سری دوره های Android Jetpack که همینطور که قبلا گفته شده، پشت سر هم و به یک ترتیب نیستن ولی همشون یک هدف رو دنبال میکنن. توی این دوره هم قصد داریم کتابخونه Room رو بهتون معرفی کنیم. 11 | 12 | این آموزش ویدیویی است و برروی **Youtube** آپلود شده است، برای استفاده بهتر از تغییر دهنده ای پی استفاده کنید! 13 | 14 |

    15 | 16 |

    17 | 18 | شاید شده باشه که دلتون بخواد توی برنامه تون بعد از این که کاربر برنامه رو بست یک سری اطلاعات رو ذخیره کرده باشین یا یک پلی لیست از موزیک های کاربر داشته باشین و دلتون بخواد اپتون توانایی این رو داشته باشه که اون پلی لیست رو به مرور زمان آپدیت کنه و بعد از بستن اپلیکیشن این اطلاعات از بین نرن. برنامه نویسان اندروید در گذشته از دیتابیسی استفاده میکردن تحت عنوان SQLite که خب یکم کارکردن باهاش سخت و دشوار بود تا این که برنامه نویسان گوگل کتابخونه ای رو درست کردن تحت عنوان Room که بهتون این امکان رو میداد که بتونین به راحتی با اون دیتابیس ارتباط برقرار کنید. 19 | 20 | 21 | 22 | 23 | 24 | ## توی این دوره چی یاد میگیریم؟ 25 | 26 | توی این دوره علاوه بر این که با Room آشنا میشیم، یاد میگیریم که Entity ها چی هستن، فایل های Data Access Object چه کاری برامون میکنن، نحوه کار و ساخت Database و Repository رو یاد میگیریم، با Forgin Relationship آشنا میشیم، با TypeConverter ها کار میکنیم و در انتها یک نگاهی به Full Text Search و Migration میندازیم. 27 | 28 |

    29 | 30 |

    31 | 32 | 33 | 34 | ## قبل شروع دوره چی باید بدونیم؟ 35 | 36 | توی این دوره از زبان **کاتلین** و فریم ورک **اندروید** استفاده میکنیم پس باید به این دو مسلط باشیم. همچنین از معماری **MVVM** استفاده میکنیم، پس برای فهم بهتر روی کد ها باید آشنایی با **LiveData** و **ViewModel** داشته باشیم. همچنین برای طراحی صفحات از **Databinding** استفاده میکنیم پس بهتره برای فهم بهتر این مفاهیم به دوره های قبلی ما مراجعه داشته باشید( در حال حاظر این دوره ها تولید نشده اند! ) 37 | 38 | همچنین اگر با **دیتابیس** آشنایی ندارید بهتره یک نگاهی به این لینک بندازین. ( لینک) 39 | 40 |
    -------------------------------------------------------------------------------- /_tutorials/android-jetpack/room/modifying-product-view.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "اضفه کردن ویوی Product" 4 | category: android-jetpack/room 5 | unit: 6 | chapter: 8 7 | --- 8 | 9 |
    10 | 11 |

    12 | 13 |

    14 | 15 | کد های این قسمت رو میتونید در مرحله 6 [گیتهاب](https://github.com/KotlinFarsi/kf01-BasicSample/tree/Step.06-Solution-Modifying-Product-View) پیدا کنید. 16 | 17 |
    -------------------------------------------------------------------------------- /_tutorials/android-jetpack/room/modifying-view-and-viewmodel-layer.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "تغییرات بر روی لایه View و ViewModel" 4 | category: android-jetpack/room 5 | unit: 6 | chapter: 6 7 | --- 8 | 9 |
    10 | 11 |

    12 | 13 |

    14 | 15 | کد این بخش: 16 |
    17 | 18 | ```kotlin 19 | class ProductListViewModel(application: Application) : AndroidViewModel(application) { 20 | 21 | private var mRepository: DataRepository 22 | 23 | private var mObservableProducts: MediatorLiveData> 24 | 25 | init { 26 | mObservableProducts = MediatorLiveData() 27 | // set by default null, until we get data from the database. 28 | mObservableProducts.value = null 29 | mRepository = (application as BasicApp).getRepository() 30 | val products = mRepository.getProducts() 31 | mObservableProducts.addSource(products , mObservableProducts::setValue) 32 | } 33 | 34 | fun getProducts(): LiveData> { 35 | return mObservableProducts 36 | } 37 | 38 | fun searchProducts(query: String){ 39 | } 40 | } 41 | ``` 42 | 43 | ```kotlin 44 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 45 | super.onViewCreated(view, savedInstanceState) 46 | viewModel = ViewModelProvider(this).get(ProductListViewModel::class.java) 47 | mBinding.lifecycleOwner = this 48 | 49 | subscribeUi(viewModel.getProducts()) 50 | } 51 | 52 | private fun subscribeUi(liveData: LiveData>) { 53 | liveData.observe(viewLifecycleOwner, Observer { myProducts -> 54 | if (myProducts != null) { 55 | mBinding.isLoading = false 56 | mProductAdapter?.setProductList(myProducts) 57 | } else { 58 | mBinding.isLoading = true 59 | } 60 | mBinding.executePendingBindings() 61 | }) 62 | } 63 | ``` 64 | -------------------------------------------------------------------------------- /_tutorials/android/anko-and-extension-functions.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "Anko و توابع الحاقی" 4 | category: android 5 | unit: 7 6 | chapter: 0 7 | sub_headers: 8 | - Anko چیست؟ 9 | - شروع به استفاده از Anko 10 | - توابع الحاقی 11 | --- 12 | 13 | 14 |
    15 | 16 | 17 | 18 |
    19 | 20 | ## Anko چیست؟ 21 | 22 |
    23 | 24 | Anko یک کتابخونه قدرتمند توسعه یافته توسط شرکت JetBrains هه. هدف اصلیش تولید صفحات UI با استفاده از Code به جای فایل xml هه .این یک ویژگی خیلی جالبه که بهتون پیشنهاد میکنم امتحانش کنید ولی من توی این پروژه ازش استفاده نمیکنم.برای من استفاده از xml راحت تره ولی شما میتونین این روش رو پیش بگیرین. 25 | 26 | اگرچه این تنها ویژگی نیست که ما از این کتابخونه بدست میاریم.Anko شامل تعداد زیادی از خصیصه ها و توابعه که میتونه کار رو براتون راحت¬تر کنه.شما مثال¬های زیادی توی این دوره خواهین دید و سریعا متوجه خواهید شد که چه مشکلاتی رو این کتابخونه حل میکنه. 27 | 28 |
    29 | 30 | ## شروع به استفاده از Anko 31 | 32 |
    33 | 34 | قبل از اینکه جلوتر بریم بهتره از Anko برای خلاصه سازی کدهامون استفاده کنیم. همینطور که خواهید دید، زمانی که از Anko استفاده میکنیم، اون همیشه یک import رو به همراه نام اون خصیصه یا تابع که ازش استفاده میکنیم رو به فایل اضافه میکنه. به این دلیل که Anko از توابع الحاقی استفاده میکنه تا بتونه ویژگیهای جدید رو به محیطتون اضافه کنه. 35 | 36 | داخل کلاس `MainActivity` ما میتونیم از تابع ساده¬تری برای پیداکردن `RecyclerView` استفاده کنیم: 37 | 38 |
    39 | 40 | ```kotlin 41 | val forecastList: RecyclerView = find(R.id.forecast_list) 42 | ``` 43 | 44 | بهتره که با این کتابخونه بیشتر آشنا شین چون که خیلی از توابع این کتابخونه میتونه کارهارو براتون راحت تر کنه. 45 | 46 |
    47 | 48 |
    49 | 50 | ## توابع الحاقی 51 | 52 |
    53 | 54 | تابع الحاقی تابعیه که میتونه رفتار جدیدی رو به کلاس اضافه کنه، حتی زمانی که دسترسی به سورس کد اون کلاس نداشته باشیم. مزیت استفاده از این توابع توی کاتلین اینه که لازم نیست اون شی رو به عنوان یک آرگومان ورودی به تابع پاس بدیم.تابع الحاقی دقیقا طوری عمل میکنه انگار جزئی از کلاسه و ما حتی میتونیم خود اون کلاس رو با استفاده از `this` به تابعمون پاس بدیم! 55 | 56 | به عنوان مثال ما میتونیم یک `toast` درست کنیم که دیگه لازم نباشه `context` رو بهش پاس بدیم! و این میتونه توی `Activity` ها و `Service` ها مورد استفاده قراربگیره! 57 | 58 |
    59 | 60 | ```kotlin 61 | fun Context.toast(message: CharSequence, duration: Int = Toast.LENGTH_SHORT) { 62 | Toast.makeText(this, message, duration).show() 63 | } 64 | ``` 65 | 66 |
    67 | 68 | به عنوان مثال وقتی میخوایم داخل Activity ازش استفاده کنیم : 69 | 70 |
    71 | 72 | ```kotlin 73 | toast("Hello world!") 74 | toast("Hello world!", Toast.LENGTH_LONG) 75 | ``` 76 | 77 |
    78 | 79 | البته که Anko یک تابع `Toast` به مانند همین تابع درست کرده.Anko توابع مختلفی برای هم `CharSequence` و هم `resource` درست کرده که از اونجا رشته رو بهش پاس بدین، همچنین توابعی برای `toast` های کوتاه و بلند هم درست کرده! 80 | 81 |
    82 | 83 | ```kotlin 84 | toast("Hello world!") 85 | longToast(R.id.hello_world) 86 | ``` 87 | 88 |
    89 | 90 | توابع الحاقی حتی میتونن روی خصیصه ها هم انجام بشن!مثال بعدی که میبینین درواقع یک تابع الحاقی پیاده شده برروی یک خصیصه است که به مانند توابع الحاقی معمولیه. اینجا ما `getter` و `setter` دلخواه خودمون رو نوشتیم 91 | 92 |
    93 | 94 | ```kotlin 95 | public var TextView.text: CharSequence 96 | get() = getText() 97 | set(v) = setText(v) 98 | ``` 99 | 100 |
    101 | 102 | توابع الحاقی در واقع کلاس اصلی رو تغییر نمیدن بلکه تنها یک static import به جاییه که ازش استفاده میشه. توابع الحاقی میتونه در هر کلاسی تعریف بشه، این میتونه تمرین خوبی باشه اگه یک دسته از توابع الحاقی مرتبط رو توی یک فایل ذخیره کنیم. 103 | 104 |
    105 | 106 | 107 | -------------------------------------------------------------------------------- /_tutorials/android/data-classes.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "کلاس های دیتا" 4 | category: android 5 | unit: 9 6 | chapter: 0 7 | sub_headers: 8 | - توابع اضافی 9 | - کپی کردن یک کلاس دیتا 10 | - مپ کردن یک شی به متغیرها 11 | --- 12 | 13 | 14 |
    15 | 16 | 17 | 18 | کلاس های دیتا یکی از قدرتمندترین کلاس های کاتلین هستن که از نوشتن کدهای اضافی و بیهوده جلوگیری میکنن. 19 | 20 | POJO : کلاس هایی که برای نگه داشتن وضعیت به کار میرن و معمولا فعالیت های ساده ای رو انجام میدن. معمولا تنها توابع `getter` و `setter` ای مهیا میکنن که اجازه دسترسی به `field` هاشون رو میده. 21 | 22 | تعریف کلاس های دیتا در کاتلین واقعا به سادگی کد زیره : 23 | 24 |
    25 | 26 | ```kotlin 27 | data class Forecast(val date: Date, val temperature: Float, val details: String) 28 | ``` 29 | 30 |
    31 | 32 |
    33 | 34 | ## توابع اضافی 35 | 36 |
    37 | 38 | کلاس های دیتا یکسری توابع جالب در اختیارمون قرار میده و اینها همه جدا از دسترسی به خصیصه¬هاش هستن. 39 | * `equals()` : خصیصه¬های دو شی رو با هم مقایسه میکنه که ببینه برابر هستن یا نه. 40 | * `hashCode()` : hash-Code محاسبه شده از روی خصیصه هارو برمیگردونه. 41 | * `copy()` : میتونیم با استفاده از این یک شی رو به علاوه با خصیصه هاش کپی کنیم 42 | * تعدادی دیگه از توابع 43 | 44 |
    45 | 46 | ## کپی کردن یک کلاس دیتا 47 | 48 |
    49 | 50 | اگه ما از خاصیت مصون بودن استفاده کنیم نمیتونیم مقدارش رو عوض کنیم، مگر این که یک مقدار جدید بهش بدیم( منظور اینه که یک شی جدید ازش بسازین و بهش نسبت بدین) . توی کلاس های دیتا تابعی ظاهر شده به نام `copy()` که کارش کپی کردن از یک شی هه ولی یکی دیگه از خوبیاش اینه که شما هم میتونین از یک شی کپی بگیرین و هم مقدار جدید به جای خصیصه های دلخواهتون بذارین: 51 | 52 |
    53 | 54 | ```kotlin 55 | val f1 = Forecast(Date(), 27.5f, "Shiny day") 56 | val f2 = f1.copy(temperature = 30f) 57 | ``` 58 | 59 |
    60 | 61 | الان ما با استفاده از این تابع دیتای شی اول رو کپی کردیم و تنها مقدار `temperature` رو عوض کردیم، بدون این که مقدار بقیه حالت ها و شی اول عوض شه ! 62 | 63 |
    64 | 65 | ## مپ کردن یک شی به متغیرها 66 | 67 |
    68 | 69 | این روند به نام multi-declaration انجام میگیره و به معنی مپ کردن هر خصیصه داخل یک شی به یک متغیره. (اگر دقت کرده باشین، در هنگام استفاده از شی ها، توابعی به نام `ComponentX` وجود دارن که به صورت اتومات ساخته میشن و دلیل ساخته شدنشون هم همینه). به مثال زیر دقت کنین: 70 |
    71 | 72 | ```kotlin 73 | val f1 = Forecast(Date(), 27.5f, "Shiny day") 74 | val (date, temperature, details) = f1 75 | ``` 76 | 77 |
    78 | 79 | این multi-declaration به کد های زیر کامپایل میشه: 80 | 81 |
    82 | 83 | ```kotlin 84 | val date = f1.component1() 85 | val temperature = f1.component2() 86 | val details = f1.component3() 87 | ``` 88 | 89 |
    90 | 91 | ایده پشت این ویژگی خیلی قدرتمنده و میتونه توی خلاصه سازی کدمون توی شرایط مختلف کمک کنه. به عنوان مثال کلاس Map یکسری توابع الحاقی داره که پیاده سازی شده تا بتونن کلیدها و مقادیر اون هارو شناسایی کنن: 92 | 93 |
    94 | 95 | ```kotlin 96 | for ((key, value) in map) { 97 | Log.d("map", "key:$key, value:$value") 98 | } 99 | ``` 100 | 101 | 102 | 103 | -------------------------------------------------------------------------------- /_tutorials/android/getting-ready.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "آماده شدن" 4 | category: android 5 | unit: 2 6 | chapter: 0 7 | sub_headers: 8 | - اندروید استودیو 9 | - نصب پلاگین کاتلین 10 | --- 11 | 12 | 13 |
    14 | 15 | 16 | 17 | خب حالا که فهمیدید چه کارهایی میشه با کاتلین انجام داد، من مطمئنم شما منتظر اینین که هرچه زودتر در عمل ازش استفاده کنین. نگران نباشید، بخش های ابتدایی این دوره بهتون کمک میکنه که چطور محیط توسعه اتون رو برای کاتلین تنظیم کنین تا بتونین هرچه زودتر شروع به کدزنی کنین. 18 | 19 | 20 | 21 |
    22 | 23 | ## اندروید استودیو 24 | 25 |
    26 | 27 | اولین چیزی که مسلما نیازدارین اینه که اندروید استودیو رو نصب کرده باشین. همینطور که میدونین اندروید استودیو یک محیط توسعه رسمی برای اندرویده که از سال 2013 به صورت پیشنمایشی و سال 2014 به صورت نهایی درمعرض استفاده قرارگرفت. 28 | 29 | اندروید استودیو به صورت پلاگین برروی IntelliJ IDEA پیاده سازی شد. IDEA یک محیط توسعه جاواست که توسط شرکت JetBrains ساخته شده.همین شرکت سازنده Kotlin هم هست و همینطور که میبینین همه­ی این­ها با هم ارتبط دارن. 30 | 31 | قبول کردن اندروید استدیو به عنوان محیط توسعه نرم­افزاری یکی از مهم­ترین قدم هایی بود که توسعه دهندگان اندروید برداشتن، اول به این دلیل که محیط باگ دار Eclipse رو ترک کردن و به سمت محیطی رفتن که مخصوص توسعه­دهندگان جاوا طراحی شده بود.ما امروزه از خیلی از ویژگی های این محیط مثل هوشمندی، سرعت، تکمیل کد ، آنالیز کدش لذت و استفاده می­بریم. 32 | 33 | و دلیل دوم به خاطر Gradle بود، چراکه به عنوان یک Build System رسمی برای اندروید شناخته شده بود که خیلی از امکانات جدید مربوط به version Building و deploy رو ممکن کرده بود. دوتا از امکانات جذاب Gradle یکی build systems و دیگری flavours هه که این امکان رو بهمون میده که به تعداد زیادی از یک بیس کد، اپ های مختلف توسعه بدیم. 34 | 35 | اگه هنوز از Eclipse استفاده میکنین، متاسفانه برای این که تا پایان این دوره همراهمون باشین نیازه که به Android­ Studio سویچ کنین.تیم توسعه­دهنده کاتلین برای Eclipse هم پلاگینی درست کردن ولی خب مسلما همیشه نسبت به اندروید استودیه عقب خواهد بود و مطمئنن طولی نخواهد کشید که متوجه بشین چه چیزهایی رو دارین ازدست میدین به محض این که استفاده ازش رو شروع کنین. 36 | 37 | هدف این دوره استفاده از Android Studio و Gradle نیست ولی اگر از این ابزار­ها استفاده نکردین، نگران نباشین. من مطمئنم که شما میتونین در این بین چیزهایی رو یادبگیرین و همراه این دوره باشین. 38 | 39 | 40 | 41 |
    42 | 43 | ## نصب پلاگین کاتلین 44 | 45 |
    46 | 47 | از IntelliJ 15 پلاگین کاتلین به صورت نصب شده برروی IDEA ارائه میشه، این ممکنه که Android Studio شما هنوز این پلاگین رو نداشته باشه و لازم باشه که شما به قسمت Plugins در خود استودیو مراجعه کنین و این پلاگین رو نصب کنین. 48 | 49 | حالا محیط شما اماده شده تا بدون یک ذره تفاوت نسبت به جاوا ، این زبون رو بفهمه ، کامپایل و اجرا کنه. 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /_tutorials/android/making-the-forecast-list-clickable.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "قابل کلیک سازی لیست پیشبینی" 4 | category: android 5 | unit: 6 | chapter: 7 | sub_headers: 8 | --- 9 | 10 | 11 |
    12 | 13 | 14 | 15 | 16 | آیتم های فعلی لیوت مون نیاز به مقداری کار داره تا برای اپ واقعی اماده بشه. اولین کار ساختن یک Xml مناسب با نیاز های ابتداییمونه. ما میخوایم یک آیکون، یک date و یک توضیحات به علاوه بالا و پایین بودن دما رو نشون بدیم. خب پس شروع میکنیم به ساختن لیوت `item_forecast.xml` : 17 | 18 |
    19 | 20 | ```xml 21 | 22 | ``` -------------------------------------------------------------------------------- /_tutorials/introduction/annotations-in-kotlin-and-summary.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "annotation ها در کاتلین و خلاصه بخش هشت" 4 | category: introduction 5 | unit: 8 6 | chapter: 7 7 | --- 8 | 9 | 10 |
    11 | 12 | 13 | 14 | درواقع Annotation های کاتلین کاملا با Annotation های جاوا همسو هستن. در قسمت Advance میبینیم که چه طور Annotation های دلخواه خودمون رو درست کنیم ولی فعلا یادتون میدم که چجوری بتونین از Annotation های آماده ی جاوا استفاده کنید. 15 | 16 | برای یادگیری این مبحث لازمه که حداقل با Junit اشنا باشین و Junit رو به پروژتون اضافه کنین 17 | 18 |
    19 | 20 | ```kotlin 21 | import org.junit.Test 22 | 23 | class AnnotationsTest{ 24 | @Test fun testAnnotation(){ 25 | 26 | } 27 | } 28 | ``` 29 | 30 |
    31 | 32 | دقیقا به همون طریقی که Annotation هارو توی جاوا استفاده میکردیم اینجا هم با قراردادن @ میتونیم از اون ها استفاده کنیم. 33 | 34 | همینطور که کلاس هارو میتونیستم با استفاده از as با نام دیگه صدا بزنیم اینجاهم میتونیم همین کار رو انجام بدیم 35 | 36 |
    37 | 38 | ```kotlin 39 | import org.junit.Test as Specification 40 | 41 | class AnnotationsTest{ 42 | @Specification fun testAnnotation(){ 43 | 44 | } 45 | } 46 | ``` 47 | 48 |
    49 | 50 | **خلاصه بخش 8:** 51 | 52 | 1- با SmartCasting اشنا شدیم 53 | 54 | 2- فهمیدم که چندگانه ها در کاتلین محدود هستند، بیشتر از 3گانه باید از کلاس های دیتا استفاده بشه 55 | 56 | 3- یادگرفتیم چگونه یک مقدار رو بشکنیم و این زمانیکه میخوایم از کلاس های دیتا یا چندگانه ها استفاده کنیم مفیده و معنی بهتری داره 57 | 58 | 4- نیازی به Exception های چک شده در کاتلین وجود ندارند. 59 | 60 | 5- Constant ها میتونند یا به صورت objectو یا به عنوان خصیصه های Top-Level استفاده بشن 61 | 62 | 6- Annotation ها در کاتلین قابل دسترسی اند و همچنین Annotation های جاوا رو میشه در کاتلین استفاده کرد 63 | 64 | 65 |
    66 | -------------------------------------------------------------------------------- /_tutorials/introduction/classes-in-kotlin/result-1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/classes-in-kotlin/result-1.PNG -------------------------------------------------------------------------------- /_tutorials/introduction/classes-in-kotlin/result-2.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/classes-in-kotlin/result-2.PNG -------------------------------------------------------------------------------- /_tutorials/introduction/classes-in-kotlin/result-3.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/classes-in-kotlin/result-3.PNG -------------------------------------------------------------------------------- /_tutorials/introduction/closures-in-kotlin.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "closure ها در کاتلین" 4 | category: introduction 5 | unit: 9 6 | chapter: 3 7 | --- 8 | 9 | 10 |
    11 | 12 | 13 | 14 | خب حالا که با چند تا از ویژگی های Lambda آشنا شدین خوبه که سراغ بحث دیگه ای به نام Closure ها بریم: 15 | 16 |
    17 | 18 | ```kotlin 19 | fun unaryOperation(x:Int,op: (Int) -> Int){ 20 | op(x) 21 | } 22 | fun outsideFunction() { 23 | val number = 10 24 | unaryOperation(20) { it * number } 25 | } 26 | ``` 27 | 28 |
    29 | 30 | یک تابع نوشتیم که یک تابع High-Order داخلش استفاده شده. (همون unaryOperation که توی جلسه قبلی ساختیمش) و دیدین که این تابع High-Order به متغیر خارج عبارت لاندایی که تعریف کردیم دسترسی داره! و اگه با IntelliJ IDEA این کد رو بزنین متوجه میشین که با نگه داشتن موشواره بر روی number بهمون میگه که “variable captured in a closure” و درواقع این بهمون میفهمونه که ما به مقدار متغییری دسترسی داشتیم که خارج عبارت lambda تعریف شده و مشکلی هم نداره. 31 | 32 | بذارین یه حلقه for داشته باشیم 33 | 34 |
    35 | 36 | ```kotlin 37 | fun unaryOperation(x:Int,op: (Int) -> Int){ 38 | op(x) 39 | } 40 | fun outsideFunction() { 41 | for (number in 1..30) { 42 | unaryOperation(20) { 43 | println(number) 44 | it * number 45 | } 46 | } 47 | } 48 | 49 | fun main(args: Array){ 50 | outsideFunction() 51 | } 52 | ``` 53 | 54 |
    55 | 56 | که بیاد و در هر مرتبه اجرا مقدار number رو پرینت کنه. اگه توی main تابع outsideFunction رو صدا بزنیم متوجه میشیم که مقادیر تغییر میکنن و لازم به گفتنه که در بعضی زبان‌ها اینجوری تعریف شدن که مقدار متغییرها ثابت بمونن ولی در کاتلین میتونن تغییر کنند. 57 | 58 |
    59 | -------------------------------------------------------------------------------- /_tutorials/introduction/conditional-execution-with-if-and-when-in-kotlin/result-1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/conditional-execution-with-if-and-when-in-kotlin/result-1.PNG -------------------------------------------------------------------------------- /_tutorials/introduction/conditional-execution-with-if-and-when-in-kotlin/result-2.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/conditional-execution-with-if-and-when-in-kotlin/result-2.PNG -------------------------------------------------------------------------------- /_tutorials/introduction/conventions-used-with-kotlin-and-summary.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "خلاصه بخش دوم" 4 | category: introduction 5 | unit: 2 6 | chapter: 6 7 | --- 8 | 9 | 10 |
    11 | 12 | 13 | 14 | خب ما توی این دوره قراره که کلی کد کاتلین بزنیم، بنابراین بهتره که با یک سری قرارداد های اون آشنا بشیم. کاتلین تمرکز اصلیش روی Java بوده بنابراین ما همون قرارداد های جاوا رو دنبال میکنیم بنابراین اگر با قرارداد های جاوا آشنا نیستید بهتره که همین الان با هم یک مروری بکنیم. ما از LowerCamelCase ها برای نامگذاری استفاده می کنیم، این به این معنیه : 15 | 16 |
    17 | 18 | ```kotlin 19 | var HelloWorld // eshtebah 20 | var helloWorld // dorost 21 | ``` 22 | 23 |
    24 | 25 | تایپ ها(Types) رو با حروف درشت مینویسیم، متد ها و خاصیت هارو با lower camelcase مینویسیم ، نقطه ویزگول ها اختیاری هستند و تنها یک جا ازشون استفاده میشه( بعدا راجع بهش صحبت میکنیم) ، پکیج ها برعکس نوشته میشوند یعنی به جای introduction.kotlinfarsi.com مینویسیم com.kotlinfarsi.introduction 26 | 27 | شما میتونید چندین کلاس در یک فایل داشته باشید و همچنین پکیج ها نیاز ندارند که دقیقا هم نام فولدرها باشند هرچند که پیشنهاد میشود که اینگونه باشند. 28 | 29 | ## خلاصه این بخش: 30 | 31 | 1- کاتلین زبونیه که Java و هم JavaScript رو هم پوشش میده ( البته روی ورژنی از کاتلین داره کار میشه به نام Kotlin Native که اون دیگه اوج برنامه نویسیه و یک دوره مجزا نیاز داره تا بشه توضیح بدیم، این بخش درحال توسعه است) 32 | 33 | 2- کاتلین بایت کد هایی رو درست میکنه که با JVM قابل اجرا هستش. 34 | 35 | 3- کاملا با جاوا همزیسته، هم میتونید در جاوا از کلاس ها و توابع کاتلین استفاده کنید و هم برعکس داخل کاتلین از جاوا. 36 | -------------------------------------------------------------------------------- /_tutorials/introduction/declaring-constants.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "constant ها" 4 | category: introduction 5 | unit: 8 6 | chapter: 5 7 | --- 8 | 9 | 10 |
    11 | 12 | 13 | 14 | مبحث بعدی که میخوام دربارش صحبت کنم Constant هاست. ما خیلی درمورد constant ها صحبت نکردیم تنها جایی که اشاره ای بهش شد زمانی بود که میخواستیم یک object بسازیم. خب حالا چجوری میتونیم Constant ها رو بسازیم، در واقع ما نحوه ساخت اون ها رو قبلا دیدیم 15 | 16 |
    17 | 18 | ```kotlin 19 | object Copyright { 20 | val author = "Sina Darvishi" 21 | } 22 | ``` 23 | 24 |
    25 | 26 | یک object ساختیم و یک خصیصه بهش دادیم. همین. در واقع فرقی با ساختن یک object که قبلا دیدیم نداره. ما درواقع از همین به عنوان constant استفاده میکنیم. 27 | 28 | و من میتونم توی هرجایی ازش استفاده کنم 29 | 30 |
    31 | 32 | ```kotlin 33 | object Copyright { 34 | val author = "Sina Darvishi" 35 | } 36 | 37 | fun main(args: Array) { 38 | Copyright.author 39 | } 40 | ``` 41 | 42 | 43 |
    44 | 45 | و درواقع من هر موقع پکیجش رو اضافه کنم میتونم از این استفاده کنم. 46 | 47 | همچنین ما میتونیم Constant ها رو به عنوان Top-Level معرفی کنیم 48 | 49 |
    50 | 51 | ```kotlin 52 | val CopyrightAuthor = "Sina Darvishi" 53 | 54 | object Copyright { 55 | val author = "Sina Darvishi" 56 | } 57 | 58 | fun main(args: Array) { 59 | Copyright.author 60 | CopyrightAuthor 61 | } 62 | ``` 63 | 64 |
    65 | 66 | خب درواقع این سوال پیش میاد که آیا من باید Constant ها رو توی جاهای رندوم قرارشون بدم و هر موقع خواستم صداشون بزنم؟ 67 | 68 | درواقع این به معماری برنامتون بستگی داره، به نظر من این خیلی بهتره که Constant ها رو توی یک Object دسته بندی کنین تا این که همه رو در هرجای برنامه استفاده کنیم. 69 | 70 | مثلا وقتی میخوایم تنظیمات یک Camera رو به صورت Constant نگه داری کنیم، یک object به عنوان CameraSettings درست کنیم و constant هارو توی اون نگه داریم. 71 | 72 |
    73 | -------------------------------------------------------------------------------- /_tutorials/introduction/declaring-variables-in-kotlin.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: " تعریف متغیر در کاتلین" 4 | category: introduction 5 | unit: 3 6 | chapter: 1 7 | --- 8 | 9 | 10 |
    11 | 12 | 13 | 14 | خب وارد بخش پایه ای کاتلین شدیم، اولین چیزی که میخوایم در موردش صحبت کنیم اینه که چگونه متغیر ایجاد کنیم. اول بیام یک فایل کاتلین به نام Variables توی پروژمون بسازیم. 15 | 16 |

    17 | 18 |

    19 | 20 | همینطور که میبینین به خاطر ساختر پکیجم اون بالا چه طور نوشته شده. بیاین `main` رو باز کنیم. 21 | 22 |
    23 | 24 | ```kotlin 25 | fun main(args: Array) { 26 | 27 | } 28 | ``` 29 | 30 |
    31 | 32 | همینطور که میبینید args در واقع نام متغیر و تایپ و اون هم از جنس Array هستش و این هم یک generic type هستش که بعدا در موردش صحبت میکنیم ولی مهمترین قسمتش سینتکس کد هستش، نام متغیر ، دونقطه و تایپ اون متغیر. 33 | حالا بیاین و یک متغیر داخل main بنویسیسم 34 | 35 |
    36 | 37 | ```kotlin 38 | var streetNumber: Int 39 | ``` 40 | 41 |
    42 | 43 | اگه دقت کنید IntelliJ میاد و streetNumber رو خاکستری میکنه و اینم تنها به این دلیله که ازش استفاده نشده و فعلا چیز مهمی نیست. میتونم بیام و یک متغیر دیگه بنویسم: 44 | 45 |
    46 | 47 | ```kotlin 48 | var streetName : String = "High Street" 49 | ``` 50 | 51 |
    52 | 53 | کاتلین در واقع اجازه میده که من متغیر رو همون اول که تعریف میکنم مقدار دهی بکنم، به عنوان مثال مقادار `High Street` رو به متغییر `streetName` دادم. یک چیز دیگه که لازمه بهش توجه کنید اینه که ما از کلیدواژه `var` استفاده کردیم، درواقع این کلیدواژه میگه که ایا این متغیر یک متغییر Immutable هست یا نه، به این معنی که میتونیم مقدار جدید بهش بدیم یا نه، درواقع یک کلید واژه دیگه هم هست به نام `val` که مثل `var` هست ولی با یک تفاوت، val یک متغییر رو Immutable میکنه و var یک متغییر رو mutable، به این معنی که میتونیم مقدار جدید به یک متغییر var بدیم ولی به val نه . 54 | مثلا مینویسیم 55 | 56 |
    57 | 58 | ```kotlin 59 | val zip = "E11 P1" 60 | streetName = "Pudding Lane" 61 | zip = "SW1 ES2" 62 | ``` 63 | 64 |
    65 | 66 | میبینیم که در خطی که داریم مقدار جدیدی به zip ارور داریم و اگه موس رو روی اون خط نگه داریم متوجه میشیم که IntelliJ میگه که نمیتونیم به متغیر val مقدار جدید بدیم. پس var به این معنی است که من دارم یک متغییر میسازم که اسیب پذیره یعنی میتونه مقدار جدید بگیره و زمانی که val مینویسیم به این معنیه که من دارم یک متغیر غیر آسیب پذیر تولید میکنم، یعنی نمیتونیم مقدار جدید بهشون بدیم. اگه حالا با Java اشنا باشین val انگار همون متغییریه که اولش final داشت. 67 | 68 | یک نکته دیگه هم بگم، ما در واقع نیازی نداریم که تایپ متغیر رو ذکر کنیم، یعنی میتونیم بنویسیم 69 | 70 |
    71 | 72 | ```kotlin 73 | var streetName = "High Street" 74 | ``` 75 | 76 |
    77 | 78 | و خود کامپایلر میفهمه که با streetName چه نوع تایپی رو بده و اونو بهش نسبت بده، البته این به این معنی نیستش که میتونیم وسط برنامه تایپش رو عوض کنیم. 79 | 80 |
    81 | -------------------------------------------------------------------------------- /_tutorials/introduction/declaring-variables-in-kotlin/first-view-of-variables.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/declaring-variables-in-kotlin/first-view-of-variables.PNG -------------------------------------------------------------------------------- /_tutorials/introduction/deconstructing-values.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "deconstructing values" 4 | category: introduction 5 | unit: 8 6 | chapter: 3 7 | --- 8 | 9 | 10 |
    11 | 12 | 13 | 14 | ما دیدیم که زمانی که داریم به دوگانه ها یا سه گانه ها دسترسی پیدا میکنیم، هر دسترسی رو با استفاده از first و second و third انجام میدیم، خب البته مشکلی هم نیست ولی خب یکی از هدف های کاتلین این بود که دقیق تر کد بزنیم و این که بگیم اولی یا دومی یا سومی دقیق نیست یعنی اصلا اولی یا دومی چی هستند؟ و درواقع من باید برم به محل تعریف تابع تا متوجه بشم اولی چیه یا دومی یا سومی. 15 | 16 | به عنوان مثال کدی که نوشتیم رو نگاه کنین: 17 | 18 |
    19 | 20 | ```kotlin 21 | fun capitalAndPopulation(country: String): Pair{ 22 | return Pair("Madrid",2000000) 23 | } 24 | 25 | fun main(args: Array) { 26 | val result = capitalAndPopulation("Spain") 27 | println(result.first) 28 | println(result.second) 29 | } 30 | ``` 31 | 32 |
    33 | 34 | خب ما اینجا result رو داریم و در نتیجه میتونیم first و second رو بدست بیاریم، ولی first چه مقداری رو بهمون میداد ؟ یا second چی؟ خب برای این که بفهمیم میریم بالا و نگاه میکنیم میبینیم که String و Long رو داریم برمیگردونیم ولی بازم دیدگاهی نداریم که این دو نماینده چه متغییر هایی بودن. 35 | 36 | کاتلین برای حل این مشکل بهمون این امکان رو میده که متغییر هارو بشکنین، به عنوان مثال کد زیر رو نگاه کنین: 37 | 38 |
    39 | 40 | ```kotlin 41 | fun capitalAndPopulation(country: String): Pair{ 42 | return Pair("Madrid",2000000) 43 | } 44 | 45 | fun main(args: Array) { 46 | val (capital,population) = capitalAndPopulation("Spain") 47 | 48 | println(capital) 49 | println(population) 50 | } 51 | ``` 52 | 53 |
    54 | 55 | در واقع این به معنیه اینه که من میتونم به جای این که جواب رو توی یک متغیر بریزم، جواب رو توی دومتغیر با نام دلخواه بریزم.البته این شکستن تنها برای چندگانه ها نیست. اگر به کد تعریف دوگانه ها یا سه گانه ها مراجعه کنید(در IntelliJ IDEA دکمه ctrl را نگه دارید و موس را برروی Pair ببرید و کلیک کنید) متوجه خواهید شد که درواقع دوگانه ها یا سه گانه ها کلاس های دیتای از پیش تعریف شده ای هستند که ما از انها استفاده میکنیم. پس همینطور که ما میتونیم برای دوگانه ها به عنوان مثال مقادیر خروجی رو بشکنیم، همین کار رو برای کلاس های دیتا هم میتونیم انجام بدیم. به عنوان مثال 56 | 57 |
    58 | 59 | ```kotlin 60 | data class CustomerKotlin(var id: Int, var name: String, var email: String){ 61 | override fun toString(): String { 62 | return "{\"id\": \"$id\", \"name\": \"$name\"}" 63 | } 64 | } 65 | 66 | fun main(args: Array) { 67 | val (id,name,email) = CustomerKotlin(1,"Sina","Sinadarvi@gmail.com") 68 | println(id) 69 | println(name) 70 | println(email) 71 | } 72 | ``` 73 | -------------------------------------------------------------------------------- /_tutorials/introduction/enum-classes-in-kotlin/result-1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/enum-classes-in-kotlin/result-1.PNG -------------------------------------------------------------------------------- /_tutorials/introduction/enum-classes-in-kotlin/result-2.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/enum-classes-in-kotlin/result-2.PNG -------------------------------------------------------------------------------- /_tutorials/introduction/enum-classes-in-kotlin/result-3.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/enum-classes-in-kotlin/result-3.PNG -------------------------------------------------------------------------------- /_tutorials/introduction/extension-functions-from-java.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "توابع الحاقی کاتلین از جاوا" 4 | category: introduction 5 | unit: 10 6 | chapter: 6 7 | --- 8 | 9 | 10 |
    11 | 12 | 13 | 14 | اخرین موردی که میخوایم توی این بخش در موردش صحبت کنیم استفاده، صدازدن توابع الحاقی کاتلین از جاوا است. بیاین به فایل CustomerKotlin مراجعه کنیم و یک تابع الحاقی بهش اضافه کنیم 15 | 16 |
    17 | 18 | ```kotlin 19 | fun CustomerKotlin.extention(){ 20 | 21 | } 22 | ``` 23 | 24 |
    25 | 26 | و حالا اگه به فایل جاوامون مراجعه کنیم تنها به این روش میتونیم از این تابعمون استفاده کنیم: 27 | 28 |
    29 | 30 | ```java 31 | CustomerKotlinKt.extention(customerKotlin); 32 | ``` 33 | 34 |
    35 | 36 | درواقع ما اینجا از همون فایل استفاده میکنیم و چون میخوایم روی یک کلاس شی خاصمون این تابع رو اعمال کنیم، این شی رو به تابع پاس بدیم و در نهایت همون فرآیند که میخوایم روی اون شی به عمل میاد. 37 | 38 |
    39 | -------------------------------------------------------------------------------- /_tutorials/introduction/extension-functions-in-kotlin-and-summary.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "عبارت های الحاقی در کاتلین و خلاصه بخش نهم" 4 | category: introduction 5 | unit: 9 6 | chapter: 4 7 | --- 8 | 9 | 10 |
    11 | 12 | 13 | 14 | کاتلین یک ویژگی خیلی مهم رو ساپورت میکنه به نام توابع الحاقی، که درواقع از C# الهام گرفته شده. ایده پشت این ویژگی اینه که من بتونم یک تابع رو به یک کلاس الحاق کنم بدون این که از اون کلاس ارث بری کنم 15 | 16 | کد زیر رو نگاه کنین: 17 | 18 |
    19 | 20 | ```kotlin 21 | fun String.hello(){ 22 | println("It's me") 23 | } 24 | ``` 25 | 26 |
    27 | 28 | در واقع اینجا یک الحاق به کلاس String انجام دادیم. یک تابع جدید به کلاس String اضافه کردیم که تنها یک رشته رو چاپ میکنه و برای استفاده ازش کافیه بنویسیم : 29 | 30 |
    31 | 32 | ```kotlin 33 | fun String.hello(){ 34 | println("It's me") 35 | } 36 | 37 | fun main(args: Array) { 38 | "Sina".hello() 39 | } 40 | ``` 41 | 42 |
    43 | 44 | 'و خب اگه اجراش کنین متوجه میشین که تابع الحاقیمون رو اجرا کرده. 45 | 46 | خب بیاین یک تابع مفیدتر بنویسیم: 47 | 48 |
    49 | 50 | ```kotlin 51 | fun String.toTilteCase(): String { 52 | return this.split(" ").joinToString(" ") { it.capitalize() } 53 | } 54 | ``` 55 | 56 |
    57 | 58 | نیاز نیست که حالا درمورد این زنجیره و توابع داخلش نگران باشین، چیزی که اینجا مهمه اینه که با استفاده از this مقدار خود String که این تابع به اون الحاق شده رو داخل تابع الحاقیمون استفاده کردیم. 59 | 60 |
    61 | 62 | ```kotlin 63 | fun String.toTilteCase(): String { 64 | return this.split(" ").joinToString(" ") { it.capitalize() } 65 | } 66 | 67 | fun main(args: Array) { 68 | println("this is a sample string to title case".toTilteCase()) 69 | } 70 | ``` 71 | 72 |

    73 | 74 |

    75 | 76 |
    77 | 78 | **خلاصه بخش 9:** 79 | 80 | 1- ما توی این قسمت نگاهی به توابع High-Order انداختیم و دیدیم که توابع High-Order حساب میشن که یا یک تابع رو به عنوان ورودی قبول کنن و یا این که تابع رو به عنوان خروجی پاس بدن 81 | 82 | 2- دیدم که کاتلین استفاده از Lambda را ممکن کرده 83 | 84 | 3- دیدم که کاتلین اجازه دسترسی به Closure های تغییر داده شده رو میده، به این معنی که اگر در داخل عبارت لاندامون از متغییری استفاده کردیم که تغییر میکنه، اون تغییر به داخل لاندامون هم سرایت میکنه. 85 | 86 | 4- و دیدیم که توابع الحاقی توابعی هستند که میتونیم اون هارو بدون ارث بری از کلاس به اون کلاس اضافه کنیم. که این کار رو درواقع برای کلاس های جاوا هم میتونیم انجام بدیم. 87 | 88 | 89 |
    90 | -------------------------------------------------------------------------------- /_tutorials/introduction/extension-functions-in-kotlin-and-summary/result-1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/extension-functions-in-kotlin-and-summary/result-1.PNG -------------------------------------------------------------------------------- /_tutorials/introduction/function-with-default-and-named-parameters-in-kotlin.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "تابع با پارامترهای پیشفرض و نامیده شده" 4 | category: introduction 5 | unit: 4 6 | chapter: 2 7 | --- 8 | 9 | 10 |
    11 | 12 | 13 | 14 | حالا، یکی از ویژگی هایی که همراه کاتلین میاد اینه که توابعمون میتونن مقادیر پیشفرض داشته باشند. مثلا تابع sum رو نوشیتم که یادتون میاد.خب حالا فرض کنین من میخوام یک مقدار z هم در نظر بگیرم، که البته بعضی جاها نیاز به 2 پارامتر و بعضی جاها نیاز به 3 پارامتر داریم! یعنی بعضی جاها پارامتر سوممون به صورت دیفالت صفر باید درنظر گرفته بشه. 15 | 16 |
    17 | 18 | ```kotlin 19 | fun sum(x:Int, y:Int, z:Int=0) = x+y+z 20 | 21 | fun main(args: Array) { 22 | sum(1,2,3) 23 | sum(1,2) 24 | } 25 | ``` 26 | 27 |
    28 | 29 | نگاه کنین، کامپایلر میاد نگاه میکنه،اگه پارامتر سوم فراهم شده بود که همون مقدار رو استفاده میکنه، اگه پارامتر سوم فراهم نشده بود از مقدار دیفالت استفاده میکنه! و این خوبه، چراکه بهمون این قابلیت رو میده که یک تابع با چندین پارامتر دیفالت داشته باشیم و از تکرار بی مورد(overload) توابع جلوگیری کنیم. مثلا توی جاوا اگر میخواستیم یک تابع داشته باشیم که در بعضی مواقع دو ورودی میگرفت و در بعضی مواقع 3 ورودی، این کار امکان پذیر نبود و برای عملی شدن آن باید 2 تابع مینوشتیمف یکی با 2 ورودی و یکی با 3 ورودی که خب این مشکل در کاتلین رفع شده است. 30 | 31 | خب بیاین یک تابع دیگه رو مثال بزنیم،مثلا 32 | 33 |
    34 | 35 | ```kotlin 36 | fun printDetails(name: String,email: String="",phone: String){ 37 | println("name : $name - email : $email - phone : $phone") 38 | } 39 | ``` 40 | 41 |
    42 | 43 | اومدم یک تابع درست کردم که مقدار اول و سوم رو درخواست میکنه ولی اگه مقدار دوم وارد نشد به صورت دیفالت یک مقدار جایگزینش میشه. حالا کد main رو هم مینویسم 44 | 45 |
    46 | 47 | ```kotlin 48 | printDetails("Sina Darvishi","555 87 345") 49 | ``` 50 | 51 |
    52 | 53 | برای مقدار name نام خودم رو دادم و برای مقدار شماره هم شماره خودم رو وارد کردم. ولی وقتی اجراش کنیم متوجه میشیم که ارور میده، دلیلش هم اینه که مقدار شماره تلفن رو که من به عنوان دومین ورودی وارد کردم رو به عنوان email میگیره! در واقع میمونه که شما دارین پارامتر phone رو پاس میدین یا پارامتر email . برای رفع این مشکل هم راه حل خیلی ساده ای داریم، کاتلین این قابلیت رو توی کد نویسی به توسعه دهنده میده که وقتی میخواین به یک تابع مقدار بدین، دقیق مشخص کنین که به کدوم پارامتر میخواین مقدار بدین، پس کد درست بالا میشه: 54 | 55 |
    56 | 57 | ```kotlin 58 | printDetails("Sina Darvishi",phone = "555 87 345") 59 | ``` 60 | 61 |
    62 | 63 | در ضمن این خاصیت این قابلیت رو به ما میده که ما خارج از ترتیبی که تابع رو تعریف و پارامتر های اونو درخواست کردیم به تابع ورودی بدیم. 64 | در ضمن این قابلیت در واقع اونجایی خوبه که ما تعداد زیادی پارامتر ورودی میخوایم و در واقع گیج میشیم که کدوم ورودی برای کدوم پارامتره و ما با نام دهی به مقادیری که میخوایم به تابع پاس بدیم از این گیج شدن جلوگیری میکنیم. 65 | 66 | 67 | -------------------------------------------------------------------------------- /_tutorials/introduction/function-with-unlimited-parameters-in-kotlin-and-summary.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "تابع با پرامترهای نامحدود و خلاصه بخش چهارم" 4 | category: introduction 5 | unit: 4 6 | chapter: 3 7 | --- 8 | 9 | 10 |
    11 | 12 | 13 | 14 | اخرین بخشی که میخوایم در قسمت توابع به اون نگاه کنیم، پاس دادن تعداد نامشخص پارامتر های ورودی به تابعه. به عنوان مثال من میخوام تابعی رو تعریف کنم که قبل از این که از اون استفاده کنم، تعداد نامحدودی پارامتر ورودی قبول کنه. 15 | 16 |
    17 | 18 | ```kotlin 19 | fun printStrings(vararg strings:String){ 20 | for(string in strings){ 21 | println(string) 22 | } 23 | } 24 | ``` 25 | 26 |
    27 | 28 | تابع بالا رو نگاه کنین، با استفاده از کلید واژه vararg این مفهوم رو به کامپایلر میدم که من میخوام تابعی رو استفاده کنم که تعداد ورودی هاش مشخص نیست ولی همه انها از جنس رشته هستند. 29 | 30 | حالا من میتونم از این تابع استفاده کنم 31 | 32 |
    33 | 34 | ```kotlin 35 | printStrings("1") 36 | printStrings("1","2") 37 | printStrings("1","2","3") 38 | ``` 39 | 40 |
    41 | 42 | و هر چه قدر که ورودی دلم بخواد به تابع پاس بدم. 43 | 44 | فقط یک نکته اینجا هست، اگر من بخوام این vararg رو به یک تابع دیگه پاس بدم چه طور باید عمل کنم 45 | 46 |
    47 | 48 | ```kotlin 49 | fun printStrings(vararg strings:String){ 50 | realyPrintStirngs(*strings) 51 | } 52 | 53 | fun realyPrintStirngs(vararg strings: String) { 54 | for (string in strings) { 55 | println(string) 56 | } 57 | } 58 | ``` 59 | 60 |
    61 | 62 | واقعیتش راه حل خیلی ساده است، باید یک تابع دیگه بسازیم که vararg بگیره ولی خود پارامتر vararg رو مستقیم به تابع پاس ندیم.مثلا در اینجا string رو مستقیم پاس ندیم بلکه با استفاده از "*" قبل نام پارامتر اونو پاس بدیم! 63 | 64 | **خلاصه بخش 4** 65 | 66 | 1- توابع با استفاده از کلیدواژه fun ساخته میشوند 67 | 68 | 2- به صورت پیشفرص یک تابع تایپ Unit رو به عنوان پارامتر بازگشتی برمیگردونه 69 | 70 | 3- توی توابع به ما اجازه داده شده تا از 71 | 72 | - پارامتر های پیشفرص داشته باشیم 73 | 74 | - از پارامتر های نام دهی شده استفاده کنیم 75 | 76 | - و بی شمار ورودی برای یک تابعمون درنظر بگیریم 77 | 78 | 79 | 80 | -------------------------------------------------------------------------------- /_tutorials/introduction/higher-order-functions-in-kotlin.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "توابع Higher-Order" 4 | category: introduction 5 | unit: 9 6 | chapter: 1 7 | --- 8 | 9 | 10 |
    11 | 12 | 13 | 14 | زمانی که در مورد توابع در کاتلین صحبت شد به این اشاره کردم که باید بتونیم با توابع به صورت کلاس های شهروند مرتبه اول برخورد کنیم و یکی از ویژگی های مهمی که یک زبون رو Functional میکنه اینه که توابعش بتونن به صورت Higher-Order ظاهر شن و اگر با مفهوم Higher-Order اشنا نیستین به این معنیه که توابع بتونن توابع دیگر رو به صورت پارامتر ورودی قبول کنن یا این که یک تابع بتونه توابع دیگر رو برگردونه. کاتلین این رو و البته چیز های دیگه ای مثل عبارت های Lambda و یا توابع بی نام و غیره و غیره رو هم ساپورت میکنه و الان میخوایم ببنیم چجوری میتونیم از تموم ویژگی های یک زبان Functional استفاده کنیم. 15 | 16 | بیاین چند خط کد بنویسیم: 17 | 18 |
    19 | 20 | ```kotlin 21 | fun operation(x: Int, y: Int,op: (Int,Int)->Int): Int { 22 | return op(x,y) 23 | } 24 | ``` 25 | 26 |
    27 | 28 | یک تابع نوشتیم به نام operation که دو متغیر x و y و همچنین یک تابع دیگر رو به عنوان ورودی دریافت میکنه که البته این تابع ورودی، دو متغیر از جنس Int دریافت میکنه و یک مقدار Int برمیگردونه و در انتها هم ما مقدار x و y رو به تابع op دادیم و مقدارش رو برمیگردونیم.به همین سادگی در کاتلین یک تابع High-Order نوشتیم. 29 | 30 | خب ما چطور میتونیم از این استفاده کنیم؟ مسلما باید یک تابع بنوسیم که با الگو (Int,Int) -> Int جور دربیاد، به عنوان مثال تابع زیر رو درنظر بگیرین 31 | 32 |
    33 | 34 | ```kotlin 35 | fun sum(x: Int, y: Int) = x + y 36 | ``` 37 | 38 |
    39 | 40 | توی کاتلین برای صدا زدن به وسیله نام اون تابع باید از "::" استفاده کنیم 41 | 42 |
    43 | 44 | 45 | ```kotlin 46 | fun operation(x: Int, y: Int,op: (Int,Int)->Int): Int { 47 | return op(x,y) 48 | } 49 | 50 | fun sum(x: Int, y: Int) = x + y 51 | 52 | fun main(args: Array) { 53 | println(operation(2,3,::sum)) 54 | } 55 | ``` 56 | 57 |
    58 | 59 | شما توی کاتلین هرجور که دوست دارین میتونین توابع High-Order بنویسین: 60 | 61 |
    62 | 63 | ```kotlin 64 | fun operation(x:Int, op: (Int)-> Unit){ 65 | 66 | } 67 | 68 | fun route(path: String,vararg actions: (String,String)-> String){ 69 | 70 | } 71 | ``` 72 | 73 |
    74 | 75 | و هیچ گونه محدودیتی در استفاده از توابع High-Order نداریم. 76 | 77 |
    78 | 79 | 80 | -------------------------------------------------------------------------------- /_tutorials/introduction/higher-order-functions-in-kotlin/result-1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/higher-order-functions-in-kotlin/result-1.PNG -------------------------------------------------------------------------------- /_tutorials/introduction/inheritance-in-kotlin.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "ارث بری در کاتلین" 4 | category: introduction 5 | unit: 6 6 | chapter: 1 7 | --- 8 | 9 | 10 |
    11 | 12 | 13 | 14 | کاتلین ارث بری رو مثل بقیه زبون های شی گرا ساپورت میکنه و توی کاتلین، کلاس پایه ای همه ی کلاس ها Any هستش. یعنی درواقع اگه یک کلاس باز کنم به این فرم 15 | 16 |
    17 | 18 | ```kotlin 19 | class Customer 20 | ``` 21 | 22 |
    23 | 24 | در واقع هیچ فرقی نداره با این که کلاسی باز کنم به این فرم 25 | 26 |
    27 | 28 | ```kotlin 29 | class Customer: Any() 30 | ``` 31 | 32 |
    33 | 34 | خب حالا بیاین یه کلاس پدر برای Customer بسازیم. 35 | 36 |
    37 | 38 | ```kotlin 39 | class Person 40 | 41 | class Customer: Person() 42 | ``` 43 | 44 |
    45 | 46 | فقط یادتون باشه وقتی کلاس رو inherit میکنین کانستراکتورش رو هم مشخص کنین. 47 | 48 | اگه کد بالا رو بزنین متوجه میشین که ارور توی برنامتون هست.مشکل اینجاست که توی کاتلین همه ی تایپ ها final هستند بنابراین نمیشه ازشون ارث بری بشه.یه جورایی میشه گفت برعکس جاوا که همیشه میتونیم ارثبری کنیم مگر این که final باشه، توی کاتلین هم میشه گفت همیشه میتونیم از یک کلاس ارث بری کنیم اگر اون کلاس open باشه. 49 | 50 |
    51 | 52 | ```kotlin 53 | open class Person 54 | 55 | class Customer: Person() 56 | ``` 57 | 58 |
    59 | 60 | برای توابع هم اگه میخوایم ازشون ارث بری بشه باید open قبلشون بیاد 61 | 62 |
    63 | 64 | ```kotlin 65 | open class Person{ 66 | open fun validate(){ 67 | 68 | } 69 | } 70 | 71 | class Customer: Person(){ 72 | override fun validate() { 73 | super.validate() 74 | } 75 | } 76 | ``` 77 | 78 |
    79 | 80 | خب حالا اگه به همراه main بخوایم تابع validate رو صدا کنیم داریم 81 | 82 |
    83 | 84 | ```kotlin 85 | open class Person{ 86 | open fun validate(){ 87 | 88 | } 89 | } 90 | 91 | class Customer: Person(){ 92 | override fun validate() { 93 | super.validate() 94 | } 95 | } 96 | 97 | fun main(args: Array) { 98 | val customer = Customer() 99 | 100 | customer.validate() 101 | } 102 | ``` 103 | 104 |
    105 | 106 | خب حالا فرض کنین توی Customer هستیم و میخوایم کانستراکتور پدرش رو صدا بزنیم، یادتونه گفتیم یه کانستراکتور دوم داریم؟ اینجا تقریبا میخوایم از همون استفاده کنیم، با این تفاوت که به جای this باید از super استفاده کنیم 107 | 108 |
    109 | 110 | ```kotlin 111 | open class Person{ 112 | open fun validate(){ 113 | 114 | } 115 | } 116 | 117 | class Customer: Person{ 118 | override fun validate() { 119 | super.validate() 120 | } 121 | 122 | constructor():super(){ 123 | 124 | } 125 | } 126 | ``` 127 | 128 |
    129 | 130 | فقط اینجا توجه کنین که علاوه بر این که به جای this از super استفاده کردیم پس باید کانستراکتور Person رو زمان ارث بری حذف کنیم، یعنی مثلا اینجا اومدیم و پرانتز های جلوی Person رو برداشتیم. 131 | 132 |
    133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | -------------------------------------------------------------------------------- /_tutorials/introduction/installing-the-tooling.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "نصب کردن ابرازآلات" 4 | category: introduction 5 | unit: 2 6 | chapter: 2 7 | --- 8 | 9 | 10 |
    11 | 12 | 13 | 14 | خب بیشتر این دوره کدنوشتنه و اگه شما بتونین هم پای من بیاین و کد بزنین خیلی بهتر میشه. 15 | 16 | برای این که شروع کنیم شما به یک سری نرم افزار و ابزار ها نیاز دارین. خب مسلما به JDK نیاز خواهید بود که ما به نام Java Development Kit میشناسیمش و شما میتونین از نسخه 6 یا 7 یا 8 استفاده کنید. شما همچنین به کامپایلر Kotlin نیاز خواهید داشت و همچنین یک Editor و یا یک IDE . 17 | 18 | من قراره از IntelliJ IDEA استفاده کنم ولی شما میتونین از هر IDE که دلتون میخواد و کاتلین رو ساپورت کنه استفاده کنین. 19 | -------------------------------------------------------------------------------- /_tutorials/introduction/interfaces-in-kotlin/result-1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/interfaces-in-kotlin/result-1.PNG -------------------------------------------------------------------------------- /_tutorials/introduction/interop-with-java-7-and-8-and-summary.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "همکاری با جاوا 7 و 8 و خلاصه بخش دهم" 4 | category: introduction 5 | unit: 10 6 | chapter: 7 7 | --- 8 | 9 | 10 |
    11 | 12 | 13 | 14 | ما گفتیم که کاتلین قابلیت همکاری با Java 6.0 رو هم داره به این معنی که هرچی که روی جاوا 6 اجرا میشه ( به عنوان مثال اندروید) میتونه روی کاتلین هم اجرا بشه پس نیازه که Java 6.0 رو هم هدفمون قرار بدیم. به عنوان مثال توابع Lambda در جاوا 6 کلاس های بی نام هستن. 15 | 16 | 17 | **خلاصه بخش 10:** 18 | 19 | 1- متوجه شدیم که هم از کاتلین میتونیم به فایل جاوا دسترسی داشته باشیم و هم از جاوا به کاتلین 20 | 21 | 2- این که یک مقدار null باشه یا نه به توسعه دهنده بستگی داره و همچنین قابلیت استفاده از Annotation ها رو هم داریم 22 | 23 | 3- میتونیم از API های 8 و 7 استفاده کنیم 24 | 25 | -------------------------------------------------------------------------------- /_tutorials/introduction/interoperability-with-java.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "همکاری با جاوا" 4 | category: introduction 5 | unit: 10 6 | chapter: 1 7 | --- 8 | 9 | 10 |
    11 | 12 | 13 | 14 | در ابتدای این دوره دیدیم که در بعضی مواقع از کلاس های جاوا استفاده کردیم ولی توی این قسمت میخوایم بیشتر روی قابلیت همکاری کاتلین صحبت کنیم و همینطور که چندبار در طول این دوره اشاره کردم، کاتلین به راحتی میتونه با کلاس ها و توابع جاوا همکاری و ارتباط برقرار کنه به این معنی که میتونین در یک پروژه به راحتی از این دو زبون استفاده کنین و مزیتش اینه که اگر شما یک پروژه جاوا داشته باشین نیازی نیست که پروژه رو دور بریزین و همه چیز رو از اول بنویسین، تنها کاری که باید بکنین اینه که یک کلاس کاتلین بنویسین و از اون توابع و کلاس های جاوایی که قبلاً ساختین رو در اون استفاده کنین و همچنین یک ویژگی جالب و قشنگی که Intellij IDEA داره اینه که میتونه یک کلاس جاوا رو بگیره و اون رو به یک کلاس کاتلین تبدیل کنه. 15 | 16 | همکاری با کلاس‌های جاوا این مزیت رو بهمون میده که بتونیم از تموم کتابخانه هایی که برای JVM نوشته شده استفاده کنیم و همونطور که گفتم این مزیت رو بهمون میده که نیازی نباشه همه چیز رو از اول بنویسیم، نیازی نباشه که صبر کنیم تا یک سیستم بالابیاد و بعدش بتونیم در پروژه هامون استفاده اش کنیم. البته که خب به مراتب کاتلین با مفهوم تر و خلاصه تر و بهتر از جاواست و این به توسعه‌دهنده ها این اجازه رو میده که برای این که استفاده از یک API راحت تر بشه بیان و لایبری های کاتلین رو درست کنن که البته این کار خوبیه ولی دلیل نمیشه که نتونیم از همون کتابخونه های قبلی استفاده کنیم. 17 | 18 | البته زمانی که داریم از جاوا داخل کاتلین استفاده میکنیم باید بر طبق روند کاتلین حرکت کنیم و بلعکس اگر از کاتلین در جاوا استفاده میکنیم باید طبق روند جاوا عمل کنیم. 19 | 20 |
    21 | -------------------------------------------------------------------------------- /_tutorials/introduction/introduction-to-jvm.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "آشنایی با JVM" 4 | category: introduction 5 | unit: 2 6 | chapter: 1 7 | --- 8 | 9 | 10 |
    11 | 12 | 13 | 14 | JVM یا Java Virtual Machine یک ماشین انتزائیه که برنامه های Java رو اجرا میکنه. ولی این محیط از چند بخش تشکیل شده؛ به عنوان مثال برای اجرای برنامه های جاوا ما نیاز به یک محیطی داریم که بتونیم توش برنامه های جاوامون رو اجرا کنیم که اون محیط JRE و یا Java Runtime Environment نام داره. همچنین برای توسعه برنامه های جاوا ما نیاز به JDK و یا Java Development Kit داریم که با این کیت بتونیم برنامه های جاوامون رو توسعه بدیم. 15 | خب به قسمتی میرسیم که ببنیم که کاتلین چگونه برنامه های خودش رو اجرا میکنه ولی قبلش باید ببینیم که جاوا چجوری یک فایل رو اجرا میکنه. 16 | اول این که ما مسلماً یک سری کد مینویسم و توی یک فایل مثلا Customer.java ذخیره میکنیم. حالا کامپایلر جاوا رو صدا میزنیم که اون کد هارو جوری کامپایل کنه که اون فایل ها قابل اجرا باشن بر روی ماشین مجازی، پس کامپایلر یک سری بایت کد درست میکنه که اون فایل ها اجرا بشن. 17 | حالا بریم سمت کاتلین: 18 | فرض میکنیم که ما میخواهیم فایل Customer.kt را اجرا کنیم.ابتدا این فایل توسط کامپایلر کاتلین به فایل Customer.Class تبدیل میشه که این فایل همون ByteCode های جاواست و این فایل همون فایلیه که توسط JVM اجرا میشه. دقت کردین که اینجا هیچگونه بار اضافه اجرایی یا به اصطلاح ( overhead ) به سیستم وارد نمیشه و عملا داریم همون بایت کد هایی رو اجرا میکنیم که اگه کدمون رو به جاوا مینوشتیم درست میشد! 19 | همون طور که گفتیم یکی از خصوصیات Kotlin اینه که باید قابلیت همکاری با Java را داشته باشد و همینطور که می بینین همینجوریه چون عملا بایت کد ها چون از یک جنس هستند میتونن با هم همکاری کنن ولی خب در بخش همکاری پذیری به این ویژگی بیشتر میپردازیم. 20 | پس یادمون باشه که نیازی به نوشتن یا تبدیل کردن پروژه های جاوامون نیست! ما میتونیم همینجوری از اون ها داخل پروژه های جدیدمون استفاده کنیم. یعنی میتونید توی یک پروژه هم کاتلین کد بزنین و هم جاوا! 21 | -------------------------------------------------------------------------------- /_tutorials/introduction/kotlin-data-classes/result-1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/kotlin-data-classes/result-1.PNG -------------------------------------------------------------------------------- /_tutorials/introduction/kotlin-data-classes/result-2.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/kotlin-data-classes/result-2.PNG -------------------------------------------------------------------------------- /_tutorials/introduction/kotlin-data-classes/result-3.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/kotlin-data-classes/result-3.PNG -------------------------------------------------------------------------------- /_tutorials/introduction/kotlin-data-classes/result-4.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/kotlin-data-classes/result-4.PNG -------------------------------------------------------------------------------- /_tutorials/introduction/kotlin-standard-library-and-working-with-collections-in-kotlin/kotlin-collection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/kotlin-standard-library-and-working-with-collections-in-kotlin/kotlin-collection.png -------------------------------------------------------------------------------- /_tutorials/introduction/kotlin-standard-library-and-working-with-collections-in-kotlin/list-collection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/kotlin-standard-library-and-working-with-collections-in-kotlin/list-collection.png -------------------------------------------------------------------------------- /_tutorials/introduction/kotlin-standard-library-and-working-with-collections-in-kotlin/listof-type.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/kotlin-standard-library-and-working-with-collections-in-kotlin/listof-type.png -------------------------------------------------------------------------------- /_tutorials/introduction/kotlin-standard-library-and-working-with-collections-in-kotlin/listof.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/kotlin-standard-library-and-working-with-collections-in-kotlin/listof.png -------------------------------------------------------------------------------- /_tutorials/introduction/kotlin-with-intellij-idea/compiled-application.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/kotlin-with-intellij-idea/compiled-application.PNG -------------------------------------------------------------------------------- /_tutorials/introduction/kotlin-with-intellij-idea/create-main.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/kotlin-with-intellij-idea/create-main.PNG -------------------------------------------------------------------------------- /_tutorials/introduction/kotlin-with-intellij-idea/debug-application.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/kotlin-with-intellij-idea/debug-application.PNG -------------------------------------------------------------------------------- /_tutorials/introduction/kotlin-with-intellij-idea/new-project-1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/kotlin-with-intellij-idea/new-project-1.PNG -------------------------------------------------------------------------------- /_tutorials/introduction/kotlin-with-intellij-idea/new-project-2.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/kotlin-with-intellij-idea/new-project-2.PNG -------------------------------------------------------------------------------- /_tutorials/introduction/kotlin-with-intellij-idea/new-project-3.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/kotlin-with-intellij-idea/new-project-3.PNG -------------------------------------------------------------------------------- /_tutorials/introduction/kotlin-with-intellij-idea/view-of-first-application.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/kotlin-with-intellij-idea/view-of-first-application.PNG -------------------------------------------------------------------------------- /_tutorials/introduction/kotlin-with-intellij-idea/view-of-main.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/kotlin-with-intellij-idea/view-of-main.PNG -------------------------------------------------------------------------------- /_tutorials/introduction/kotlin-with-intellij-idea/welcome-to-intellij-idea.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/kotlin-with-intellij-idea/welcome-to-intellij-idea.PNG -------------------------------------------------------------------------------- /_tutorials/introduction/lambda-expressions-in-kotlin/result-1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/lambda-expressions-in-kotlin/result-1.PNG -------------------------------------------------------------------------------- /_tutorials/introduction/loops-and-ranges-in-kotlin.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "حلقه ها در کاتلین" 4 | category: introduction 5 | unit: 3 6 | chapter: 3 7 | --- 8 | 9 | 10 |
    11 | 12 | 13 | 14 | حالا بیاین یکم نگاه حلقه ها کنیم، 15 | 16 | یک فایل دیگه به نام `LoopsAndRanges` درست میکنیم و `main` رو داخلش مینویسیم 17 | 18 | 19 |

    20 | 21 |

    22 | 23 | اگه دقت کنیم داخل این فایل هم `main` داریم و داخل فایل قبلی هم `main` داریم. ایا همچین چیزی ممکن است؟ درواقع کاتلین همیچین اجازه رو میده که به ازای هر فایل یک `main` داشته باشیم. 24 | 25 | خب حالا از این قضیه بگذریم، بیاین یک حلقه `for` درست کنیم 26 | 27 |
    28 | 29 | ```kotlin 30 | for(a:Int in 1..100){ 31 | println(a) 32 | } 33 | ``` 34 | 35 |
    36 | 37 | 38 | ابتدا نام یک متغیر رو تعریف میکنیم که میخوایم بر روی اون راه بریم. سپس تایپش رو معرفی میکنیم سپس با استفاده از کلید واژه `in` میگیم که میخوایم در چه محدوده ای(هرچی جلوش میاد) راه بریم و بعدش محدوده رو تعریف میکنیم و در انتها هم هرچی جلوی اکولاد ها میاد رو هر دفعه انجام میده. در واقع ما اینجا هم میتونیم تایپ رو مشخص نکنیم و خود کامپایلر میفهمه منظورمون کدوم تایپه. 39 | نکته ای که در اینجا باید توجه کنیم بهش اینه که اون `..` که اومده درواقع همان تابع `rangeTo()` است. در واقع ما میتونیم اینجور بنویسیم: 40 | 41 |
    42 | 43 | ```kotlin 44 | val numbers = 1..100 45 | ``` 46 | 47 |
    48 | 49 | که درواقع داریم یک لیست درست میکنیم از اعداد 1 تا 100 . و اگه بخوام یک حلقه `for` درست کنیم میتونیم از همین `numbers` استفاده کنیم 50 | 51 |
    52 | 53 | ```kotlin 54 | for(a in numbers){ 55 | print(a) 56 | } 57 | ``` 58 | 59 |
    60 | 61 | حالا اگه بخوایم یک حلقه برعکس بنویسیم میتونیم به این روش انجام بدیم 62 | 63 |
    64 | 65 | ```kotlin 66 | for(a in 100 downTo 1){ 67 | println(a) 68 | } 69 | 70 | for(a in 100..1){ 71 | println(a) 72 | } 73 | ``` 74 | 75 |
    76 | 77 | حالا فرض کنید میخوایم از 100 تا 1 پایین بیایم ولی 5 تا 5 تا : 78 | 79 |
    80 | 81 | ```kotlin 82 | for(b in 100..1 step 5){ 83 | println(b) 84 | } 85 | ``` 86 | 87 |
    88 | 89 | ولی خب این تنها یک حلقه برروی شماره ها بود، کاتلین این اجازه رو میده که برروی دسته ها هم راه برید. مثلا کد زیر رو در نظر بگیرین 90 | 91 |
    92 | 93 | ```kotlin 94 | val capitals = listOf("London","Paris","Rome","Madrid") 95 | for(capital in capitals){ 96 | println(capital) 97 | } 98 | ``` 99 | 100 |
    101 | 102 | حالا کار نداشته باشین اون listOf چیه و چگونه کار میکنه فعلا فقط بدونین که یک لیست درست میکنه. به همین راحتی این لیست رو به for میدیم و اون روی این لیست راه میره و تموم اون مرکز شهر هارو چاپ میکنه. 103 | 104 | خب حلقه ها تنها for نیستند، مثلا while و do while نیز به صورت زیر نوشته میشوند 105 | 106 |
    107 | 108 | ```kotlin 109 | var i = 100 110 | while (i>0){ 111 | i-- 112 | } 113 | var x = 10 114 | do { 115 | x-- 116 | }while (x>0) 117 | ``` 118 | 119 |
    120 | 121 | حالا خارج از بحث حلقه ها، کاتلین این ویژگی را به کاربر میدهد که بتواند حلقه را ادامه دهد یا از حلقه بیرون بیایید. به عنوان مثال به تکه کد زیر دقت کنید: 122 | 123 |
    124 | 125 | ```kotlin 126 | loop@ for (i in 1..100){ 127 | for(j in 1..100){ 128 | if(i%j == 0) 129 | break@loop 130 | } 131 | } 132 | ``` 133 | 134 |
    135 | 136 | در اینجا ما با هدف قرار دادن حلقه اول از حلقه دوم خارج میشویم به این صورت که وقتی break را مینویسم با یک @ یک لیبل را مشخص میکنیم که میخواهیم به ان وارد شویم. و همینطور با continue 137 | 138 |
    139 | 140 | ```kotlin 141 | loop@ for (i in 1..100){ 142 | for(j in 1..100){ 143 | if(i%j == 0) 144 | continue 145 | } 146 | } 147 | ``` 148 | 149 | 150 | 151 | 152 | 153 | 154 | -------------------------------------------------------------------------------- /_tutorials/introduction/loops-and-ranges-in-kotlin/view-of-class.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/loops-and-ranges-in-kotlin/view-of-class.PNG -------------------------------------------------------------------------------- /_tutorials/introduction/member-functions-in-kotlin.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "توابعِ عضو در کاتلین" 4 | category: introduction 5 | unit: 5 6 | chapter: 2 7 | --- 8 | 9 | 10 |
    11 | 12 | 13 | 14 | 15 | ما دیدیم که چگونه یه تابع Top-Level بسازیم، اما به هرحال کاتلین یه زبون شی گراست و بنابراین باید بتونیم داخل کلاس هم تابع بنویسیم که به این تابع ها Member-Functions میگن. 16 | 17 | ولی خب تعریف تابع داخل کلاس خیلی راه حل سر راستی داره، به همون راحتی که قبلا توی یک فایل تابع مینوشیتم، مثلا کد زیر رو نگاه کنین 18 | 19 |
    20 | 21 | ```kotlin 22 | class Customer(var id: Int, var name: String, var yearOfBirth: Int){ 23 | 24 | fun customerAsString(){ 25 | println("id : $id - name : $name") 26 | } 27 | } 28 | ``` 29 | 30 |
    31 | 32 | که تابعمون دو خاصیت رو از کلاسمون چاپ میکنه. 33 | 34 | برای استفاده ازش هم کافیه از شی که از کلاسمون ساختیم تابع رو صدا بزنیم 35 | 36 |
    37 | 38 | ```kotlin 39 | fun main(args: Array) { 40 | var customer = Customer(10, "Sina",1995) 41 | 42 | customer.customerAsString() 43 | } 44 | ``` 45 | -------------------------------------------------------------------------------- /_tutorials/introduction/null-safety-and-summary/result-1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/null-safety-and-summary/result-1.PNG -------------------------------------------------------------------------------- /_tutorials/introduction/objects-in-kotlin-and-summary.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "Object ها در کاتلین و خلاصه بخش پنج" 4 | category: introduction 5 | unit: 5 6 | chapter: 6 7 | --- 8 | 9 | 10 |
    11 | 12 | 13 | 14 | نمیدونم که آیا تفاوت کلاس و Object رو میدونید یا نه؟ واسه همین یه توضیح کوچولو میدم. 15 | 16 | واضح ترین تفاوت میان این دو اینه که کلاس به مانند یک نقشه برای طراحی ساختمون میمونه، یعنی در واقع شما با ساختن یک کلاس یک، نمونه میسازین که اشیاء ارث بری شده ازشون میتونن کار های دلخواهتون رو انجام بدن. ولی به عنوان مثال در JavaScript کلاس تعریف نشدس و به جای اون Object هایی ساخته میشن که میتونن 2 کار رو انجام بدن، یا به صورت یک نمونه برای Object های دیگه عمل کنن و یا خودشون همون اعمال رو انجام بدن. 17 | 18 | در کاتلین شما هم تعریفی به نام Object داری و هم تعریفی به نام Class و خب در نتیجه مواقعی که لازمه میتونید از Object استفاده کنید مخصوصا مواقعی که میخواین Functional کد بنویسین. 19 | 20 | خب حالا بیاین ببینیم چجوری: 21 | 22 |
    23 | 24 | ```kotlin 25 | object Global{ 26 | val PI = 3.14 27 | } 28 | 29 | fun main(args: Array) { 30 | println(Global.PI) 31 | } 32 | ``` 33 | 34 |
    35 | 36 | به همین سادگی که میبینین. من حتی میتونم همین object رو به صورت یک عبارت بیان کنم. 37 | 38 |
    39 | 40 | ```kotlin 41 | object Global{ 42 | val PI = 3.14 43 | } 44 | 45 | fun main(args: Array) { 46 | val localObject = object { 47 | val PI = 3.14159 48 | } 49 | 50 | println(localObject.PI) 51 | println(Global.PI) 52 | } 53 | ``` 54 |
    55 | 56 | تفاوتی که این دو دارن اینه که عبارت ها سریعا ساخته میشن! خب البته درمورد استفاده های Object بعدا بیشتر صحبت میکنیم. 57 | 58 | **خلاصه بخش 5:** 59 | 60 | 1- کلاس ها به مانند شهروند رتبه اول در کاتلین به حساب میان( به مانند Top-level-functions) 61 | 62 | 2- میتونن خصیصه و توابع داخل خودشون داشته باشن 63 | 64 | 3- توی کاتلین چیزی به نام feild وجود نداره( البته منظورمون متغییر های feild هستش و نه اون که توی بخش کلاس های دیتا دیدیم) 65 | 66 | 4- با کلاس های دیتا اشنا شدیم 67 | 68 | 5- با enum ها اشنا شدیم 69 | 70 | 6- Object ها یک روش خیلی ساده برای ساختن singleton ها هستند 71 | 72 | 73 |
    74 | -------------------------------------------------------------------------------- /_tutorials/introduction/package-and-imports-in-kotlin-and-summary-of-kotlin-basic.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "اضافه کردن پکیج ها در کاتلین و خلاصه بخش سوم" 4 | category: introduction 5 | unit: 3 6 | chapter: 5 7 | --- 8 | 9 | 10 |
    11 | 12 | 13 | 14 | خب اگه تموم مثال هایی که زدیم رو دیده باشین متوجه شدین که ما تقریبا به یک پکیج محدود بودیم و ما داخل اون پکیج کار میکردیم.مثلا اگه همون فایل Main که دفعه اول استفاده کردیم رو نگاه کنیم متوجه خواهیم شد که ما از تابعی به نام println() استفاده کردیم . این تابع از کجا آمد؟ چجوری ازش استفاده کردیم ؟ 15 | 16 | اگه روی ویندوز هستید و دکمه Ctrl رو نگه دارید و روی تابع کلیک کنین به سمت تعریف اون تابع هدایت میشین. و اگر به ابتدای اون فایل برین متوجه میشین که این تابع داخل بسته ای به نام kotlin.ioهستش. پکیج ها به مانند جاوا و دیگر زبون ها میتونن import بشن ولی در واقع نیازی به import کردن توابعی مثل println() و به مانند این ها نیست، در واقع اونها به طور ضمنی import شدن ولی من میتونم پکیج های دیگه رو از جاهای دیگه ی برنامم import کنم. به عنوان مثال بیاین و داخل همون پکیج basic یک پکیج دیگه به نام utils باز کنیم. و داخل اون هم یک فایل به نام SampleUtils باز کنیم. 17 | 18 |

    19 | 20 |

    21 | 22 | حالا بیایم و یک تابع به نام SomeUtility() در اون باز کنیم که یک متغییر name از جنس String میگیره. 23 | 24 | خب حالا اگر به فایل Main برگردم میتونم با استفاده از کلیدواژه import ابتدا فایل SampleUtils رو اضافه کنم و بعدش از توابع داخلش استفاده کنم. توجه کنین که اگر هم ابتدا اون فایل رو import نکنم و مستقیم بنویسم SomeUtility خود intelliJ برام فایل رو import میکنه و یا از من سوال میپرسه که import اش کنم یا نه. 25 | 26 | 27 |
    28 | 29 | ```kotlin 30 | package com.kotlinfarsi.introduction.basics 31 | 32 | import com.kotlinfarsi.introduction.basics.utils.someUtility 33 | 34 | fun main(args: Array) { 35 | println("Hello World!") 36 | 37 | someUtility("Some Name") 38 | } 39 | ``` 40 | 41 |
    42 | 43 | ما میتونیم به جای این که مشخص کنیم از چه فایلی میخوایم دقیقا استفاده کنیم بگیم از کل فایل های داخل این پکیج استفاده کن و اون رو با گذاشتن * به جای someUtility انجام میدیم. 44 | 45 |
    46 | 47 | ```kotlin 48 | import com.kotlinfarsi.introduction.basics.utils.* 49 | ``` 50 | 51 |
    52 | 53 | همچنین اومدیم و فایل رو import کردیم و متوجه شدیم فایلی که import شده هم نام با یکی از فایل های دیگمونه،میتونیم به این روش جور دیگه ای ازش استفاده کنیم 54 | 55 |
    56 | 57 | ```kotlin 58 | package com.kotlinfarsi.introduction.basics 59 | 60 | import com.kotlinfarsi.introduction.basics.utils.someUtility as someAditionalFunctions 61 | 62 | fun main(args: Array) { 63 | println("Hello World!") 64 | 65 | someAditionalFunctions("Some Name") 66 | } 67 | ``` 68 | 69 |
    70 | 71 | ## خلاصه بخش 3 72 | 73 | * تا اینجا یاد گرفتیم که چگونه یک متغیر رو تغییرپذیر یا تغییر ناپذیر کنیم 74 | 75 | * با حلقه for اشنا شدیم و فهمیدیم میتونه روی یک کالکشن هم راه بره 76 | 77 | * و همچنین یاد گرفتیم که if و when میتونن به صورت یک عبارت منطقی به عنوان نتیجه برای یک متغییر استفاده بشه 78 | 79 | -------------------------------------------------------------------------------- /_tutorials/introduction/package-and-imports-in-kotlin-and-summary-of-kotlin-basic/someutils.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/package-and-imports-in-kotlin-and-summary-of-kotlin-basic/someutils.PNG -------------------------------------------------------------------------------- /_tutorials/introduction/sub1.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: مقدمه 4 | category: introduction 5 | unit: 1 6 | chapter: 0 7 | --- -------------------------------------------------------------------------------- /_tutorials/introduction/sub10.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: قابلیت همکاری و Interoperability 4 | category: introduction 5 | unit: 10 6 | chapter: 0 7 | --- -------------------------------------------------------------------------------- /_tutorials/introduction/sub11.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: کتابخانه استاندارد 4 | category: introduction 5 | unit: 11 6 | chapter: 0 7 | --- -------------------------------------------------------------------------------- /_tutorials/introduction/sub2.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: مبانی کاتلین 4 | category: introduction 5 | unit: 2 6 | chapter: 0 7 | --- -------------------------------------------------------------------------------- /_tutorials/introduction/sub3.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: کد نویسی مقدماتی کاتلین 4 | category: introduction 5 | unit: 3 6 | chapter: 0 7 | --- -------------------------------------------------------------------------------- /_tutorials/introduction/sub4.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: توابع 4 | category: introduction 5 | unit: 4 6 | chapter: 0 7 | --- -------------------------------------------------------------------------------- /_tutorials/introduction/sub5.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: کلاس ها 4 | category: introduction 5 | unit: 5 6 | chapter: 0 7 | --- -------------------------------------------------------------------------------- /_tutorials/introduction/sub6.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: ارث بری 4 | category: introduction 5 | unit: 6 6 | chapter: 0 7 | --- -------------------------------------------------------------------------------- /_tutorials/introduction/sub7.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: کارکردن با Null ها 4 | category: introduction 5 | unit: 7 6 | chapter: 0 7 | --- -------------------------------------------------------------------------------- /_tutorials/introduction/sub8.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: نکات اضافه 4 | category: introduction 5 | unit: 8 6 | chapter: 0 7 | --- -------------------------------------------------------------------------------- /_tutorials/introduction/sub9.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: نگاه functionalای 4 | category: introduction 5 | unit: 9 6 | chapter: 0 7 | --- -------------------------------------------------------------------------------- /_tutorials/introduction/talking-to-java-from-kotlin.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "صحبت کردن با جاوا از کاتلین" 4 | category: introduction 5 | unit: 10 6 | chapter: 2 7 | --- 8 | 9 | 10 |
    11 | 12 | 13 | 14 | برای تمرین این قسمت بهتر است از IntelliJ IDEA استفاده شود 15 | 16 | خب بیاین در داخل کاتلین با جاوا صحبت کنیم. توجه داشتین که یک کلاس CustomerJava داشتیم که در واقع یک Java Bean بود.خب حالا بیاین توی یک کلاس کاتلین از این کلاس جاوا یک متغیر بسازیم و بعد به یک خصیصه از اون کلاس جاوا دسترسی داشته باشم 17 | 18 |
    19 | 20 | ```kotlin 21 | fun main(args: Array) { 22 | val customer = CustomerJava() 23 | println(customer.email) 24 | } 25 | ``` 26 | 27 |
    28 | 29 | اگه دقت کنین برای استفاده از email نیازی نیست که تابع getEmail رو صدا بزنیم! تنها کاری که لازمه اینه که نام اون متغیر رو صدا بزنیم و کاتلین خودش حدس میزنه که به چی نیاز داریم. البته به این معنی نیست که تابع getEmail رو نداریم و در واقع اگه بخوایم میتونیم از این تابع استفاده کنیم ولی خود کاتلین این اجازه رو میده که نیازی به صدا کردن تابع برای خوندن مقدارش نداشته باشیم. این ویژگی مسلما برای set هم هست و هر موقع بخوایم مقدار جدیدی رو بدیم کافیه همین روش رو به کار ببریم. 30 | 31 | درمورد ارث بری هم روند کارمون سادست. بیایی یک کلاس به نام PersonJava در کد جاوامون ایجاد کنیم: 32 | 33 |
    34 | 35 | ```java 36 | public class PersonJava { 37 | private int id; 38 | 39 | public int getId() { 40 | return id; 41 | } 42 | 43 | public void setId(int id) { 44 | this.id = id; 45 | } 46 | } 47 | ``` 48 | 49 |
    50 | 51 | و حالا بیاین از این ارثبری کنیم: 52 | 53 |
    54 | 55 | ```kotlin 56 | class PersonKotlin : PersonJava() 57 | ``` 58 | 59 |
    60 | 61 | به این راحتی از یک کلاس جاوا ارثبری کردیم. این قضیه حتی برای Interface ها هم برقراره 62 | 63 |
    64 | 65 | ```java 66 | public interface CustomerRepository { 67 | CustomerJava getById(int id); 68 | List getAll(); 69 | } 70 | ``` 71 | 72 |
    73 | 74 | و حالا میتونم داخل کاتلین از این Interface استفاده کنیم 75 | 76 |
    77 | 78 | ```kotlin 79 | class KotlinCustomerRepo : CustomerRepository{ 80 | override fun getAll(): MutableList { 81 | TODO("not implemented") 82 | } 83 | 84 | override fun getById(id: Int): CustomerJava { 85 | TODO("not implemented") 86 | } 87 | } 88 | ``` 89 | 90 |
    91 | 92 | چیزی که در جاوا زیاد داریم در واقع "َAbstract متد های تنها" هستند که در واقع متد هایی هستند که در داخل کلاس اینترفیس ساخته میشن و یک نمونه ساده میتونه اینترفیس Runnable باشه. 93 | 94 | میتونیم به مانند بقیه اینترفیس ها اونو در یک کلاس کاتلین استفاده کنیم، مثلا کد زیر: 95 | 96 |
    97 | 98 | 99 | ```kotlin 100 | class RunnableKotlin : Runnable{ 101 | override fun run() { 102 | TODO("not implemented") 103 | } 104 | } 105 | ``` 106 | 107 |
    108 | 109 | ولی خب این یک راه حل خیلی ضایع برای این کاره، چرا که درواقع داریم یک کلاس رو که تنها یک تابع داره رو برای این موضوع به کار میبریم. میتونیم به مانند جاوا 1.8 به یک روش دیگه ازش استفاده کنیم: 110 | 111 |
    112 | 113 | ```kotlin 114 | val runnable = Runnable { println("Invoking") } 115 | ``` 116 | 117 |
    118 | 119 | در واقع اجازه داده شده که تا بلاک کد رو پاس بدیم بدون اینکه در گیر استفاده از یک اینترفیس بشیم 120 | 121 |
    122 | -------------------------------------------------------------------------------- /_tutorials/introduction/talking-to-kotlin-from-java/completion-2.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/talking-to-kotlin-from-java/completion-2.PNG -------------------------------------------------------------------------------- /_tutorials/introduction/talking-to-kotlin-from-java/completion-3.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/talking-to-kotlin-from-java/completion-3.PNG -------------------------------------------------------------------------------- /_tutorials/introduction/talking-to-kotlin-from-java/error-1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/talking-to-kotlin-from-java/error-1.PNG -------------------------------------------------------------------------------- /_tutorials/introduction/talking-to-kotlin-from-java/warning-1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/talking-to-kotlin-from-java/warning-1.PNG -------------------------------------------------------------------------------- /_tutorials/introduction/talking-to-kotlin-from-java/warning-2.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/talking-to-kotlin-from-java/warning-2.PNG -------------------------------------------------------------------------------- /_tutorials/introduction/the-kotlin-repl.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "کاتلین REPL" 4 | category: introduction 5 | unit: 2 6 | chapter: 3 7 | --- 8 | 9 | 10 |
    11 | 12 | 13 | 14 | زمانی که کاتلین رو نصب میکنیم همونطور که دیدید دستور زیر رو در Command Line زدیم. 15 | 16 | 17 |

    18 | 19 |

    20 | 21 | محیطی رو برامون بالا میاره که بهش Kotlin REPL میگیم و مخفف Kotlin, Read Eval Print Loop هه که میتونیم بگیم یک محیط ساده تعاملی با کامپایلره و میشه با اون یک سری چیز هارو امتحان کنیم.همینطور که شما می بینین من یک سری کد اینجا مینویسم واین محیط از کامپایلر میخواد که این دستورات رو انجام بده و نتیجش رو پرینت کنه. 22 | 23 | مثلا: 24 | 25 |

    26 | 27 |

    28 | 29 | ما حتی می تونیم تابع بنویسیم.بعدا در مورد جزئیات صحبت میکنیم ولی فعلا به عنوان مثال این تابع رو نگاه کنید: 30 | 31 |

    32 | 33 |

    34 | 35 | ما میتونیم حتی کدمون رو توی چند خط بنویسیم: 36 | 37 |

    38 | 39 |

    40 | 41 | خب، تا اینجا متوجه شدیم که اینREPL رو میتونیم با استفاده از دستور kotlinc در محیط کنسول اجرا کنیم و کنسول هم این محیط تعاملی رو بالا میاره. همینطور میتونیم این محیط رو از یک روش دیگه بالا بیاریم که مقداری فیدبک بیشتری از کدی که زدیم میگیریم و اون هم استفاده از REPL داخل IntelliJ IDEA است که مقداری تجربه کاربری رو افزایش میده. خب پس میریم IntelliJ رو بالا میاریم و یک پروژه جدید شروع میکنیم. و اگر بریم به سمت Tools>Kotlin>kotlin REPL متوجه میشیم که دقیقا همون محیط رو در اینجا داریم. 42 | 43 |

    44 | 45 |

    46 | 47 | ولی یکی از خوبی های این محیط اینه که در اینجا همگردانی و اطلاعت پارامتر ها و ... رو داریم، بدین صورت که میتونیم از کمکی که IntelliJ میکنه بهمون استفاده کنیم. حال اگر دوباره دستورات گذشته را وارد کنیم متوجه خواهیم شد که: 48 | 49 |
    50 | 51 | #### >>> fun hello(name: String){ print(name) } 52 | #### >>> hello(“Kotlin REPL”) 53 | #### Kotlin REPL 54 | -------------------------------------------------------------------------------- /_tutorials/introduction/the-kotlin-repl/bye-repl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/the-kotlin-repl/bye-repl.png -------------------------------------------------------------------------------- /_tutorials/introduction/the-kotlin-repl/hello-fun.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/the-kotlin-repl/hello-fun.png -------------------------------------------------------------------------------- /_tutorials/introduction/the-kotlin-repl/hello-world.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/the-kotlin-repl/hello-world.png -------------------------------------------------------------------------------- /_tutorials/introduction/the-kotlin-repl/kotlinc-command.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/the-kotlin-repl/kotlinc-command.png -------------------------------------------------------------------------------- /_tutorials/introduction/the-kotlin-repl/repl-in-idea.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/the-kotlin-repl/repl-in-idea.png -------------------------------------------------------------------------------- /_tutorials/introduction/top-level-functions-and-properties-in-kotlin.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "توابع و خصیصه های درجه اول" 4 | category: introduction 5 | unit: 10 6 | chapter: 5 7 | --- 8 | 9 | 10 |
    11 | 12 | 13 | 14 | خب همینطور که میدونین ما توی کاتلین توابع Top-Level داشتیم و چیزی که توی جاوا تعریف نشده این گونه توابعه. چجوری میتونیم از اینگونه توابع استفاده کنیم ؟ 15 | 16 | یک کلاس به نام TopLevelFunctions میسازیم 17 | 18 |
    19 | 20 | ```kotlin 21 | fun prefix(prefix: String, value : String): String = "$prefix-$value" 22 | ``` 23 | 24 |
    25 | 26 | و این تابع رو داخلش مینویسیم. در واقع کامپایلر وقتی این فایل رو کامپایل میکنه یک فایلی به نام TopLevelFunctionsKt.class میسازه 27 | 28 |

    29 | 30 |

    31 | 32 | یعنی درواقع کلاس TopLevelFunctions از فایل ToplevelFunctions جدا میشه! ما اگه کلاسی به همین نام در این فایل ایجاد کنیم و کامپایلش کنیم متوجه میشیم که فایل .class مربوط به اون کلاس رو جدا از فایل اصلی ساخته! 33 | 34 |

    35 | 36 |

    37 | 38 | و داخل کد هم همین قضیه برقراره، اگه بخوایم به فایل دسترسی پیدا کنیم باید از TopLevelFunctionKt استفاده کنیم و اگر به کلاس از TopLevelFunction. 39 | 40 |
    41 | 42 | ```java 43 | TopLevelFunctionsKt.prefix("Hi","Sina"); 44 | ``` 45 | 46 |
    47 | 48 | به همین راحتی. این قضیه برای خصیصه های Top-Level نیز برقراره ولی با این تفاوت که از getter و setter ها استفاده میکنیم.ولی البته که اگر بخواین میتونین به صورت field دسترسی داشته باشین و راهش استفاده از const هه . به راحتی کد زیر 49 | 50 |
    51 | 52 | ```kotlin 53 | const val year = 2017 54 | ``` 55 | 56 |
    57 | 58 | البته یادتون باشه که نمیتونین برای متغییر های var از const استفاده کنین! 59 | 60 |
    61 | -------------------------------------------------------------------------------- /_tutorials/introduction/top-level-functions-and-properties-in-kotlin/output-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/top-level-functions-and-properties-in-kotlin/output-1.png -------------------------------------------------------------------------------- /_tutorials/introduction/top-level-functions-and-properties-in-kotlin/output-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/top-level-functions-and-properties-in-kotlin/output-2.png -------------------------------------------------------------------------------- /_tutorials/introduction/tuples.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "چندتایی ها (Tuples)" 4 | category: introduction 5 | unit: 8 6 | chapter: 2 7 | --- 8 | 9 | 10 |
    11 | 12 | 13 | 14 | چندگانه ها زمانی استفاده میشن که شما به عنوان مثال خروجی یک تابع رو بخواین به صورت یک مجموعه دوگانه یا سه گانه برگردونید. باید در نظر داشته باشین که اگر تعداد خروجی هاتون بیشتر از 3 تا هست باید از کلاس ها استفاده کنید و چندگانه ها در کاتلین تا سه گانه ها بیشتر پشتیبانی نمی شوند. 15 | 16 | خب اول بیاین یک تابع درست کنیم که یک دوگانه از جمله هارو برگردونه. مثلا یک تابع داشته باشیم که قراره اسم کشور رو بگیره و اسم پایتخت و جمعیت رو برگردونه. 17 | 18 |
    19 | 20 | ```kotlin 21 | fun capitalAndPopulation(country: String): Pair{ 22 | return Pair("Madrid",2000000) 23 | } 24 | 25 | fun main(args: Array) { 26 | val result = capitalAndPopulation("Spain") 27 | println(result.first) 28 | println(result.second) 29 | } 30 | ``` 31 | 32 |
    33 | 34 | خروجی تابعمون به صورت Pair هستش و وقتی میخوایم از تابع استفاده کنیم کافیه بگیم متغیر اول رو میخوایم یا دوم. 35 | 36 | حالا اگه بخوایم یک سه گانه رو برگدونیم به این روش انجامش میدیم. 37 | 38 |
    39 | 40 | ```kotlin 41 | fun countryInformation(country: String): Triple{ 42 | return Triple("Madrid", "Europe",2300000) 43 | } 44 | 45 | fun main(args: Array) { 46 | val countryInfo = countryInformation("Spain") 47 | println(countryInfo.first) 48 | println(countryInfo.second) 49 | println(countryInfo.third) 50 | } 51 | ``` 52 | -------------------------------------------------------------------------------- /_tutorials/introduction/type-casting-in-kotlin/result-1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/type-casting-in-kotlin/result-1.PNG -------------------------------------------------------------------------------- /_tutorials/introduction/typealias-in-kotlin.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "typealias در کاتلین" 4 | category: introduction 5 | unit: 8 6 | chapter: 6 7 | --- 8 | 9 | 10 |
    11 | 12 | 13 | 14 | 15 | خب به قسمتی رسیدیم که دقیقا به بخش خاصی تعلق ندارن ولی یکی از ابزاری که میتونه خیلی کمکمون کنه. 16 | typealias ها به ما این امکان رو میدن که بتونیم یک اسم جایگزین برای کلاس هایی که میخوایم استفاده کنیم بزاریم. 17 | 18 | 19 | مثلا میتونیم اسم یکی از کلاس هامون رو کوتاه کنیم و از این به بعد از اون اسم جایگزین استفاده کنیم 20 | مثلا فرض کنید که کلاسی به این اسم داریم: 21 |
    22 | 23 | 24 | 25 | ```kotlin 26 | MutableMap> 27 | ``` 28 | 29 | 30 |
    31 | 32 | و خیلی قراره از این کلاس جاهای مختلفی استفاده کنیم که یقینا برای اینکه هربار این کلاس رو فراخونی کنیم و ازش نمونه بسازیم یه مقدار کلافه کننده ست، 33 | خوب اینجاست که این ابزار در کاتلین به کمکمون میاد و به ما این امکان رو میده که یک اسم جایگزین برای همچین کلاسی بنویسیم و از این به بعد از این نام کوتاه جای این نام طولانی کلاس استفاده کنیم. 34 |
    35 | 36 | ```kotlin 37 | typealias FileTable = MutableMap> 38 | ``` 39 | 40 |
    41 | حتی میشه از اونا برای اسم جایگزین توی inner class ها استفاده کرد: 42 |
    43 | 44 | 45 | ```kotlin 46 | class Food { 47 | inner class Pizza{ 48 | //Codes... 49 | } 50 | } 51 | 52 | typealias PizzaInnerFood = Food.Pizza 53 | ``` 54 | 55 |
    56 | نکته ای که باید بهش دقت کنید اینه که typealias ها یک کلاس یا تایپ جدیدی رو ارائه نمیدن بلکه فقط یه اسم جایگزین رو برای یک کلاس ارائه میدن. 57 |
    58 | 59 | 60 | ```kotlin 61 | typealias ArrName = ArrayList; 62 | 63 | MainActivity : AppCompatActivity(){ 64 | override fun onCreate(savedInstanceState: Bundle?) { 65 | super.onCreate(savedInstanceState) 66 | val names = ArrName() 67 | names.add("Ali") 68 | names.add("Kamran") 69 | names.add("Sara") 70 | } 71 | } 72 | ``` 73 | -------------------------------------------------------------------------------- /_tutorials/introduction/visibility-modifiers-in-kotlin.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: " visibility modifier ها در کاتلین" 4 | category: introduction 5 | unit: 5 6 | chapter: 3 7 | --- 8 | 9 | 10 |
    11 | 12 | 13 | اگه دقت کرده باشین در تموم کد هایی که تا الان نوشیتم از هیچ گونه visibility-modifier ای استفاده نکردیم. و در واقع در کاتلین این قرارداد هست که visibility-modifier پیش فرض public است. 14 | 15 | توی کاتلین 4 نوع visibility-modifier داریم: 16 | - Public که پیشفرضمونه و از همه جا قابل دسترسیه 17 | برای Top-Level-Declaration ها ( منظور تموم تعریف هایی که به صورت Top-level انجام میشه، مثلا Top-level-function ها ) 18 | - Private که تنها از داخل همون فایلی که تعریف شده قابل دسترسیه 19 | - Internal که در واقع این اجازه رو میده که از هرجای برنامه بتونیم به اون دسترسی داشته باشیم، تازمانی که داخل همون module که توش تعریف شده باشیم. درواقع module اینجا منظورمون gradle module ، maven module و غیره و امثال این هاست 20 | برای کلاس ها ما 3 نوع Visibility-modifier داریم 21 | - Private تنها دسترسی رو به عضو های یک class میده 22 | - Protected به مانند private میمونه ولی علاوه بر اون دسترسی رو به subclass ها هم میده 23 | - Internal در واقع اجازه میده که هر چیزی داخل module به اون دسترسی داشته باشه. 24 | -------------------------------------------------------------------------------- /_tutorials/introduction/welcome-to-the-course.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "به دوره خوش آمدید" 4 | category: introduction 5 | unit: 1 6 | chapter: 1 7 | --- 8 | 9 | 10 |
    11 | 12 | 13 | 14 | امروز میخوایم در مورد کاتلین ( Kotlin ) صحبت کنیم که یک زبون برنامه نویسی است که در شرکت JetBrains توسعه داده شده. 15 | این دوره بیشتر شما که توسعه دهنده نرم افزار یا معماری است که ممکنه با JVM اشنا نباشید، ما بعضی قسمت هارو که نیاز به JVM داره رو پوشش میدیم پس نیاز به نگرانی نداره اگر چیزی قبلش ندیده باشین از این ها و همچنین ما کمی درمورد پایه Kotlin صحبت خواهیم کرد و همچنین این دوره به شما اطلاعات زیادی میده تا شما بتونین این زبون برنامه نویسی رو شروع کنین و البته در قسمت پیشرفته ( Advance ) یک سری اطلاعات بیشتری در مورد این زبون برنامه نویسی خواهید دید.خب پس شروع کنیم. 16 | 17 | -------------------------------------------------------------------------------- /_tutorials/introduction/why-kotlin.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "چرا کاتلین" 4 | category: introduction 5 | unit: 1 6 | chapter: 2 7 | --- 8 | 9 | 10 |
    11 | 12 | 13 | ابتدا باید بگیم که پروژه کاتلین در سال 2010 توسط شرکت JetBrains شروع شد. در اون زمان نیاز به یک زبون احساس میشد که هم مختصر و هم پرمعنا باشه و هم ابزار های زیادی براش موجود باشه. و هم بتونه با زبون های دیگه ارتباط برقرار کنه و همکاری داشته باشه. خب همینطور که میدونید جاوا یک زبونیه که طرفدار زیادی داره و در عین حال مشکلاتی هم داره. مثلا کد ها مختصر نیستن و البته خیلی از ویژگی های زبان های برنامه نویسی مدرن رو شامل نشده چرا که ما به دنبال یک زبون برنامه نویسی مدرنی هستیم که بتونه مشکلات برنامه نویسی توسعه دهنده ها رو که هرروزه باهاش دست و پنجه نرم میکنن رو رفع کنه. پس شروع به توسعه کاتلین کردیم. همچنین کاتلین لایسنس Apache 2 رو داره. کاتلین یک statically typed language هست ( کلمه بهتری جایگزینش پیدا نکردم ) کاتلین از زبون های به مانند Java,Scala,C#,groovy الهام گرفته شده. کاتلین دو قسمت رو هدف قرار داده.یکی JVM و دیگری JS . کد کاتلینی که شما میزنین مستقیم توسط JVM قابل استفاده است و همچنین کدتون قابلیت تبدیل به JavaScript رو هم داره بدین معنی که شما میتونین هم قسمت سمت سرور و هم قسمت سمت مرورگر رو با کاتلین بنویسین.یکی از هدف های این زبون اینه که بتونیم توی سیستم عامل های مختلف اجراش کنیم والبته این شرکت بخش دیگه ای رو هم دارن روش کار میکنن به نام Kotlin/Native (خیلیا دوست دارن بهش بگن KotN ) که به ما این قابلیت رو میده تا کد کاتلینمون بتونه به طور Native برروی پلتفرم های مختلف کار کنه.به عنوان مثال iOS و یا macOS و حتی IoT و Embedded Systemها . همینطور که گفتیم این زبون این قابلیت رو داره که بتونه با جاوا همکاری کنه، این بدین معنیه که کد شما هم در کد جاوا قابل استفاده است و هم کد جاواتون داخل فایل کاتلین. به عبارت دیگه تموم لایبری هایی که برای زبون Java نوشته شده میتونه توی این زبون هم مورد استفاده قرار بگیره. این زبون از Build سیستم هایی مثل Gradle و Maven هم استفاده میکنه. همینطور که شاید خبر داشته باشین کاتلین رسما توسط شرکت گوگل برای برنامه نویسی اندروید قابل استفاده است و این خیلی خبر خوبی برای توسعه دهنده هاست چراکه میتونن با خیلی از ویژگی های Java 1.8 که نمیتونستن قبلا در اندروید استفاده کنند کار کنن. چون این زبون از زبون های دیگه ای به مانند Java و C# و … الهام گرفته شده، خیلی هم مثل همون زبون هاست. به این معنی که زمان یادگیری سینتکس رو کاهش میده و شما در طی چند روز متوجه میشین که زبون به شدت ساده ای هست. یکی از خوبیای این زبون اینه که نیازی نداریم که این همه کدی که دهه هاست در زبون جاوا زده شده رو دور بندازیم. البته که JNI هم در این زبون پشتیبانی میشه و پس ما میتونیم از توابع C و C++ استفاده کنیم. 14 | -------------------------------------------------------------------------------- /_tutorials/introduction/working-with-abstract-classes-in-kotlin.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "کارکردن با کلاس های abstract در کاتلین" 4 | category: introduction 5 | unit: 6 6 | chapter: 2 7 | --- 8 | 9 | 10 |
    11 | 12 | 13 | 14 | اگر با مفهوم abstract اشنا باشید کلاسی مد نظرمون هست که نمیتونیم ازش نمونه ای رو بسازیم ولی میتونیم از اون ارثبری کنیم. 15 | 16 |
    17 | 18 | ```kotlin 19 | abstract class StoredEntity 20 | 21 | class Employee: StoredEntity() 22 | 23 | fun main(args: Array) { 24 | val se = Employee() 25 | } 26 | ``` 27 | 28 |
    29 | 30 | خب حالا با خودتون میگین چه فایده ای داره که از کلاس های abstract استفاده کنیم؟ خب در واقع کلاس های abstract تفاوتی با کلاس های پایه ای دارند و اونم اینه که یک کلاس abstract میتونه هم مانند یک کلاس معمولی یک تابع/متغییر که مقدار دهی شده داشته باشه، و هم یک تابع abstract داشته باشه ک پیاده سازی نشده. مثلا فرض کنید که چندین کلاس داریم که یک سری کار انجام میدن ولی محتوای کارشون شبیه به هم با اندکی تفاوته، برای همین میایم یک کلاس abstract میسازیم و تابع abstract اون رو هم میسازیم ولی بدنه تابع رو توی هر کدوم از کلاس ها بسته به نوع کلاسمون میسازیم.مثال زیر رو نگاه کنین: 31 | 32 |
    33 | 34 | ```kotlin 35 | abstract class StoredEntity{ 36 | abstract fun store() 37 | } 38 | 39 | class Employee: StoredEntity() { 40 | 41 | override fun store() { 42 | TODO("not implemented") 43 | } 44 | } 45 | ``` 46 | 47 |
    48 | 49 | البته تموم عضو های کلاس abstract نیازی به abstract بودن خودشون ندارن: 50 | 51 |
    52 | 53 | ```kotlin 54 | abstract class StoredEntity{ 55 | val isActive = true 56 | 57 | abstract fun store() 58 | 59 | fun status():String{ 60 | return isActive.toString() 61 | } 62 | } 63 | 64 | class Employee: StoredEntity() { 65 | override fun store() { 66 | TODO("not implemented") 67 | } 68 | } 69 | 70 | fun main(args: Array) { 71 | val se = Employee() 72 | 73 | se.isActive 74 | se.status() 75 | } 76 | ``` 77 | 78 |
    79 | 80 | فقط همینطور که میدونید ما نمیتونیم توی main دوباره به isActive مقدار بدیم. 81 | 82 |
    83 | 84 | 85 | -------------------------------------------------------------------------------- /_tutorials/introduction/working-with-basic-types-in-kotlin.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "کار با Type های پایه ای" 4 | category: introduction 5 | unit: 3 6 | chapter: 2 7 | --- 8 | 9 | 10 |
    11 | 12 | 13 | 14 | در کاتلین در واقع همه چیز یک شی (object) است. خب به عنوان مثال اگر به یک Integer نگاه کنیم، مثلا کد زیر: 15 | 16 |
    17 | 18 | ```kotlin 19 | var myInt : Int 20 | ``` 21 | 22 |
    23 | 24 | در واقع Int یک شی است. درواقع ما تایپ های متفاوتی برای یک مقدار های عددی داریم، Byte ، Long ، Float ، Double . همینطور که میبینید ما یک سری تایپ داخلی برای متغیر ها داریم. 25 | 26 | حالا اگه یادتون باشه گفتیم نیاز نیست توی کاتلین تایپ ها رو وقتی مقدار دهی کردیم بنویسیم 27 | 28 |
    29 | 30 | ```kotlin 31 | var myLong = 10 32 | ``` 33 | 34 |
    35 | 36 | یعنی مثلا توی بالا کاتلین باید متوجه بشه که منظورمون چیه، ولی این اتفاق نمیفته و اگر myLong رو نگاه کنیم متوجه خواهیم شد که این مقدار یک Int است! خب البته کاتلین راهی برای این قضیه داره، کافیه که ما عبارت بالا رو به صورت مقابل بنویسیم 37 | 38 |
    39 | 40 | ```kotlin 41 | var myLong = 10L 42 | ``` 43 | 44 |
    45 | 46 | و حالا کاتلین متوجه میشه که شما Long میخواین. 47 | 48 | حالا اگه شما میخواین تایپ های دیگه رو معرفی کنید میتونید به این صورت بنویسین. 49 | 50 |
    51 | 52 | ```kotlin 53 | val myLong = 10L 54 | val myFloat = 100F 55 | val myHex = 0x0F 56 | val myBinary = 0xb01 57 | ``` 58 | 59 |
    60 | 61 | توی کاتلین همونطور که گفتم نمیتونین همینجوری یک تایپ رو توی یک تایپ دیگه بریزین 62 | 63 |
    64 | 65 | ```kotlin 66 | val myInt = 10 67 | val myLongAgain: Long = myInt 68 | ``` 69 | 70 |
    71 | 72 | شما نمیتونید اینجوری که بالا نوشتم بنویسین ولی راهی هست که بتونین مقدار یک Int رو توی Long بریزین. باید از توابع اون تایپ استفاده کنید یعنی خط بالا رو به این صورت بنویسین 73 | 74 |
    75 | 76 | ```kotlin 77 | val myInt = 10 78 | val myLongAgain: Long = myInt.toLong() 79 | ``` 80 |
    81 | 82 | که درواقع اجازه میده یک مقدار رو تبدیل کنید به یک مقدار دیگه. 83 | 84 | حالا بیاین بریم سراغ رشته ها،قطعه کد زیر رو ببینیم 85 | 86 |
    87 | 88 | ```kotlin 89 | val myChar = 'A' 90 | val myString = "My String" 91 | ``` 92 | 93 |
    94 | 95 | خب اگه دقت کنید کامپایلر با استفاده از " ‘ " متوجه میشه که این ایا کاراکتره یا ایا یک رشته است. 96 | 97 |
    98 | 99 | ```kotlin 100 | val escapeCharacters = "A new Line \n" 101 | ``` 102 | 103 |
    104 | 105 | میتونید از کاراکتر های پایان دهنده استفاده کنید. 106 | 107 |
    108 | 109 | ```kotlin 110 | val rawString = "Hello " + 111 | "This is second line" + 112 | "a third line" 113 | 114 | val multipleLine = """ 115 | this is a string 116 | and this is another line 117 | """ 118 | ``` 119 | 120 |
    121 | 122 | میتونید یک رشته رو در چند خط بنویسین.یک روش اینه که با استفاده از + در چند خط یک رشته رو بنویسید و یا این که با استفاده از 3 تا " " " بگین میخوایم یک رشته چند خطی بنویسیم. میتونید یک مقدار رو داخل یک رشته استفاده کنید.البته به دو روش که روش دوم خلاصه درس و کاتلینی تره. 123 | 124 |
    125 | 126 | ```kotlin 127 | val years = 10 128 | val message = "A decade is " + years + " years" 129 | val anotherMessage = "A decade is $years years" 130 | ``` 131 | 132 |
    133 | 134 | اگر از همون روش دوم استفاده کردید و میخوایین از توابع داخلی اون متغییر استفاده کنید متونید این کار رو بکنید 135 | 136 |
    137 | 138 | ```kotlin 139 | val name= "Mary" 140 | val anotherOne = "length of name is ${name.length}" 141 | ``` 142 | -------------------------------------------------------------------------------- /_tutorials/introduction/working-with-exceptions/result-1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/working-with-exceptions/result-1.PNG -------------------------------------------------------------------------------- /_tutorials/introduction/working-with-exceptions/result-2.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/_tutorials/introduction/working-with-exceptions/result-2.PNG -------------------------------------------------------------------------------- /_tutorials/introduction/working-with-nulls-from-java.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "کار کردن با null ها از جاوا" 4 | category: introduction 5 | unit: 10 6 | chapter: 3 7 | --- 8 | 9 | 10 |
    11 | 12 | 13 | 14 | ``` 15 | برای تمرین بهتر است از IntelliJ IDEA استفاده شود 16 | ``` 17 | 18 | یکی از ویژگی های کاتلین Null-Safe بودن این زبونه و دیدیم که بصورت پیشفرض تایپ ها نمیتونن null باشن و اگر میخواین که یک متغیر رو null کنین باید بیان کنین که اون nullable هه ولی خب زمانی که نوبت به همکاری با Java میرسه قضیه فرق میکنه، چراکه همه چی میتونه توی جاوا null باشه. خب اینجا باید چیکار کنیم؟ 19 | 20 | راستیتش قضیه خیلی سادست. به عبارتی برمیخوریم که ممکنه null باشه،خیلی ساده تنها از عملگر “?” استفاده میکنیم و تمام. یک مشکلی اینجا پیش میاد، مشکل که نه درواقع یک جور میشه گفت کدمون زشت میشه چرا که عبارتی خواهیم داشت که در اون به صورت تفریط از "?." استفاده شده، که این باعث میشه کدمون زشت بشه. برای حل این موضوع میتونیم از Annotation ها استفاده کنیم، بگیم که ما میدونیم که این عبارت ممکن نیست که null بشن و نیازی نداریم که از عملگری استفاده کنیم که این بازم مشکلات خودشو به وجود میاره. راه حل نهایی چیه ؟ درواقع زمانی که با جاوا کار میکنیم تصمیم نهایی با توسعه دهنده است که عبارت صدا زده شده این قابلیت رو داشته باشه که بتونه null باشه یا نه. 21 | 22 | بذارین با کد واضح تر براتون توضیح بدم. تا اینجا یادتون میاد که ما کلاسی به نام KotlinCustomRepo رو به صورت زیر ساختیم : 23 | 24 |
    25 | 26 | ```kotlin 27 | class KotlinCustomerRepo : CustomerRepository { 28 | override fun getAll(): MutableList? { 29 | TODO("not implemented") 30 | } 31 | override fun getById(id: Int): CustomerJava? { 32 | TODO("not implemented") 33 | } 34 | } 35 | ``` 36 | 37 |
    38 | 39 | ولی اگه من `?` رو پاک کنم بازم همه چیز درسته! 40 | 41 |
    42 | 43 | ```kotlin 44 | class KotlinCustomerRepo : CustomerRepository { 45 | override fun getAll(): MutableList { 46 | TODO("not implemented") 47 | } 48 | override fun getById(id: Int): CustomerJava { 49 | TODO("not implemented") 50 | } 51 | } 52 | ``` 53 | 54 |
    55 | 56 | و این درواقع دست توسعه دهنده است که به اون عبارت قابلیت داشتن null بده یا نه. 57 | 58 | بیاین بریم سراغ کلاس CustomerJava و دوتا متد به اون اضافه کنیم 59 | 60 |
    61 | 62 | ```java 63 | public @NotNull String neverNull(){ 64 | return "A String"; 65 | } 66 | 67 | public String someTimesNull(){ 68 | return "A String"; 69 | } 70 | ``` 71 | 72 |
    73 | 74 | برای متد اول از یکی از Annotation های IntelliJ استفاده کردیم که مشخص میکنه این عبارت null برنمیگردونه. (میتونه از Annotation های دیگه هم استفاده بشه) ولی دقیقا تفاوت این توی کاتلین چیه؟ تفاوت اینجاست که وقتی در یک کلاس کاتلین میخوایم از این توابع استفاده کنیم، کاتلین متوجه میشه که متد اول نمیتونه null باشه و این درحالیه که متد دوم رو nullable تصور میکنه. 75 | 76 |
    77 | -------------------------------------------------------------------------------- /_tutorials/js/introduction.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | category: js 4 | title: "مقدمه" 5 | unit: 1 6 | chapter: 0 7 | --- -------------------------------------------------------------------------------- /_tutorials/js/javascript-introp-subject.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "همکاری با JS" 4 | category: js 5 | unit: 3 6 | chapter: 0 7 | --- -------------------------------------------------------------------------------- /_tutorials/js/javascript-introp.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "همکاری با JavaScript" 4 | category: js 5 | unit: 3 6 | chapter: 1 7 | --- 8 | 9 | 10 |
    11 | 12 | 13 | 14 | یکی از ویژگی­های کاتلین همکاری مستقیم با فایل JavaScript هه.حالا ما چرا باید بخوایم که با جاوا اسکریپت همکاری کنیم؟ زمانی پیش­خواهد اومد که ما بخوایم به صورت مستقیم با فایل­های جاوا اسکریپتیمون ارتباط برقرار کنیم، بخوایم مقدار متغیری رو بخونیم، بخوایم یک تابعی رو ازش صدا بزنیم یا این که اصلا بخوایم با یک کتابخونه که توی جاوااسکریپته استفاده کنیم. توی اینجاها خیلی مهمه که بتونیم مستقیم از فایل­های جاوااسکریپتیمون استفاده کنیم 15 | 16 | توی این قسمت می­خواییم یکسری اشاره­هایی به بحث همکاری با جاوا اسکریپت بکنیم. 17 | 18 |
    19 | -------------------------------------------------------------------------------- /_tutorials/js/kotlin-basics.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "مبانی کاتلین/JS" 4 | category: js 5 | unit: 2 6 | chapter: 0 7 | --- -------------------------------------------------------------------------------- /_tutorials/js/next-session-comming-soon.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "بقیه فصل ها در حال ساخت است" 4 | category: js 5 | unit: 4 6 | chapter: 0 7 | --- -------------------------------------------------------------------------------- /_tutorials/js/working-with-the-dom-part2.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: tutorial 3 | title: "کار با DOM - بخش دوم" 4 | category: js 5 | unit: 2 6 | chapter: 2 7 | --- 8 | 9 | 10 |
    11 | 12 | 13 | 14 | این قسمت کوتاهه و مثل قسمت قبل طولانی نیست. توی این قسمت میخوایم همین کد قبلی رو بنویسیم منتهی به یک روش دیگه. کد زیر رو نگاه کنین: 15 | 16 |
    17 | 18 | ```kotlin 19 | fun main(args: Array) { 20 | println("Hello, World!") 21 | 22 | val root = document.getElementById("root") 23 | 24 | val div = document.createElement("div") 25 | val h1 = document.createElement("h1") 26 | val btn = document.createElement("button") 27 | 28 | h1.textContent = "KotlinFarsi" 29 | btn.textContent = "Click on Me" 30 | btn.addEventListener("click", { println("Clicked 2") }) 31 | 32 | div.appendChild(h1) 33 | div.appendChild(btn) 34 | 35 | root?.appendChild(div) 36 | 37 | println("The end") 38 | } 39 | ``` 40 | 41 |
    42 | 43 | 44 | فکر نمیکنم نیاز زیادی به توضیح باشه، ولی اینجا همون کاری که دفعه قبل انجام دادیم رو به یک روش دیگه انجام میدیم. با استفاده مستقیم از خصیصه textContent مستقیما مقدار text رو بهش دادیم و بعدش هم با استفاده از تابع appendChild دوتا عنصر رو به div دادیم و در انتها هم اون div رو به root دادیم. همین. 45 | 46 | خب تا اینجا با دو روش آشنا شدیم که چجوری بتونیم از html داخل کدمون استفاده کنیم. توی قسمت بعد روش سومی رو میگم که از روش های قبلی باحال­تر و استفاده ازش توی ide راحت تره. 47 | 48 |
    49 | -------------------------------------------------------------------------------- /about.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | title: درباره 4 | permalink: /about/ 5 | --- 6 | 7 | Welcome to this website! 8 | 9 | > This website is using [laobubu](http://laobubu.net)'s theme: [EasyBook](https://github.com/laobubu/jekyll-theme-EasyBook) 10 | -------------------------------------------------------------------------------- /assets/fonts/Vazir-Bold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/fonts/Vazir-Bold.eot -------------------------------------------------------------------------------- /assets/fonts/Vazir-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/fonts/Vazir-Bold.ttf -------------------------------------------------------------------------------- /assets/fonts/Vazir-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/fonts/Vazir-Bold.woff -------------------------------------------------------------------------------- /assets/fonts/Vazir-Light.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/fonts/Vazir-Light.eot -------------------------------------------------------------------------------- /assets/fonts/Vazir-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/fonts/Vazir-Light.ttf -------------------------------------------------------------------------------- /assets/fonts/Vazir-Light.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/fonts/Vazir-Light.woff -------------------------------------------------------------------------------- /assets/fonts/Vazir.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/fonts/Vazir.eot -------------------------------------------------------------------------------- /assets/fonts/Vazir.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/fonts/Vazir.ttf -------------------------------------------------------------------------------- /assets/fonts/Vazir.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/fonts/Vazir.woff -------------------------------------------------------------------------------- /assets/fonts/fonts.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: Vazir; 3 | src: url('Vazir.eot'); 4 | src: url('Vazir.eot?#iefix') format('embedded-opentype'), 5 | url('Vazir.woff') format('woff'), 6 | url('Vazir.ttf') format('truetype'); 7 | font-weight: normal; 8 | } 9 | 10 | @font-face { 11 | font-family: Vazir; 12 | src: url('Vazir-Bold.eot'); 13 | src: url('Vazir-Bold.eot?#iefix') format('embedded-opentype'), 14 | url('Vazir-Bold.woff') format('woff'), 15 | url('Vazir-Bold.ttf') format('truetype'); 16 | font-weight: bold; 17 | } 18 | 19 | @font-face { 20 | font-family: Vazir; 21 | src: url('Vazir-Light.eot'); 22 | src: url('Vazir-Light.eot?#iefix') format('embedded-opentype'), 23 | url('Vazir-Light.woff') format('woff'), 24 | url('Vazir-Light.ttf') format('truetype'); 25 | font-weight: 300; 26 | } 27 | -------------------------------------------------------------------------------- /assets/img/android-jetpack/room/adding-search-feature-and-migration-and-final/Slide32.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/android-jetpack/room/adding-search-feature-and-migration-and-final/Slide32.JPG -------------------------------------------------------------------------------- /assets/img/android-jetpack/room/creating-first-dao/dao.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/android-jetpack/room/creating-first-dao/dao.png -------------------------------------------------------------------------------- /assets/img/android-jetpack/room/creating-first-entity/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/android-jetpack/room/creating-first-entity/1.png -------------------------------------------------------------------------------- /assets/img/android-jetpack/room/creating-first-entity/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/android-jetpack/room/creating-first-entity/2.png -------------------------------------------------------------------------------- /assets/img/android-jetpack/room/creating-first-entity/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/android-jetpack/room/creating-first-entity/3.png -------------------------------------------------------------------------------- /assets/img/android-jetpack/room/final-app-and-start-coding/final-ss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/android-jetpack/room/final-app-and-start-coding/final-ss.png -------------------------------------------------------------------------------- /assets/img/android-jetpack/room/introduction/what-we-learn.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/android-jetpack/room/introduction/what-we-learn.JPG -------------------------------------------------------------------------------- /assets/img/introduction/classes-in-kotlin/result-1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/classes-in-kotlin/result-1.PNG -------------------------------------------------------------------------------- /assets/img/introduction/classes-in-kotlin/result-2.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/classes-in-kotlin/result-2.PNG -------------------------------------------------------------------------------- /assets/img/introduction/classes-in-kotlin/result-3.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/classes-in-kotlin/result-3.PNG -------------------------------------------------------------------------------- /assets/img/introduction/conditional-execution-with-if-and-when-in-kotlin/result-1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/conditional-execution-with-if-and-when-in-kotlin/result-1.PNG -------------------------------------------------------------------------------- /assets/img/introduction/conditional-execution-with-if-and-when-in-kotlin/result-2.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/conditional-execution-with-if-and-when-in-kotlin/result-2.PNG -------------------------------------------------------------------------------- /assets/img/introduction/declaring-variables-in-kotlin/first-view-of-variables.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/declaring-variables-in-kotlin/first-view-of-variables.PNG -------------------------------------------------------------------------------- /assets/img/introduction/enum-classes-in-kotlin/result-1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/enum-classes-in-kotlin/result-1.PNG -------------------------------------------------------------------------------- /assets/img/introduction/enum-classes-in-kotlin/result-2.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/enum-classes-in-kotlin/result-2.PNG -------------------------------------------------------------------------------- /assets/img/introduction/enum-classes-in-kotlin/result-3.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/enum-classes-in-kotlin/result-3.PNG -------------------------------------------------------------------------------- /assets/img/introduction/extension-functions-in-kotlin-and-summary/result-1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/extension-functions-in-kotlin-and-summary/result-1.PNG -------------------------------------------------------------------------------- /assets/img/introduction/higher-order-functions-in-kotlin/result-1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/higher-order-functions-in-kotlin/result-1.PNG -------------------------------------------------------------------------------- /assets/img/introduction/interfaces-in-kotlin/result-1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/interfaces-in-kotlin/result-1.PNG -------------------------------------------------------------------------------- /assets/img/introduction/kotlin-data-classes/result-1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/kotlin-data-classes/result-1.PNG -------------------------------------------------------------------------------- /assets/img/introduction/kotlin-data-classes/result-2.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/kotlin-data-classes/result-2.PNG -------------------------------------------------------------------------------- /assets/img/introduction/kotlin-data-classes/result-3.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/kotlin-data-classes/result-3.PNG -------------------------------------------------------------------------------- /assets/img/introduction/kotlin-data-classes/result-4.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/kotlin-data-classes/result-4.PNG -------------------------------------------------------------------------------- /assets/img/introduction/kotlin-standard-library-and-working-with-collections-in-kotlin/kotlin-collection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/kotlin-standard-library-and-working-with-collections-in-kotlin/kotlin-collection.png -------------------------------------------------------------------------------- /assets/img/introduction/kotlin-standard-library-and-working-with-collections-in-kotlin/list-collection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/kotlin-standard-library-and-working-with-collections-in-kotlin/list-collection.png -------------------------------------------------------------------------------- /assets/img/introduction/kotlin-standard-library-and-working-with-collections-in-kotlin/listof-type.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/kotlin-standard-library-and-working-with-collections-in-kotlin/listof-type.png -------------------------------------------------------------------------------- /assets/img/introduction/kotlin-standard-library-and-working-with-collections-in-kotlin/listof.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/kotlin-standard-library-and-working-with-collections-in-kotlin/listof.png -------------------------------------------------------------------------------- /assets/img/introduction/kotlin-with-intellij-idea/compiled-application.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/kotlin-with-intellij-idea/compiled-application.PNG -------------------------------------------------------------------------------- /assets/img/introduction/kotlin-with-intellij-idea/create-main.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/kotlin-with-intellij-idea/create-main.PNG -------------------------------------------------------------------------------- /assets/img/introduction/kotlin-with-intellij-idea/debug-application.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/kotlin-with-intellij-idea/debug-application.PNG -------------------------------------------------------------------------------- /assets/img/introduction/kotlin-with-intellij-idea/new-project-1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/kotlin-with-intellij-idea/new-project-1.PNG -------------------------------------------------------------------------------- /assets/img/introduction/kotlin-with-intellij-idea/new-project-2.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/kotlin-with-intellij-idea/new-project-2.PNG -------------------------------------------------------------------------------- /assets/img/introduction/kotlin-with-intellij-idea/new-project-3.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/kotlin-with-intellij-idea/new-project-3.PNG -------------------------------------------------------------------------------- /assets/img/introduction/kotlin-with-intellij-idea/view-of-first-application.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/kotlin-with-intellij-idea/view-of-first-application.PNG -------------------------------------------------------------------------------- /assets/img/introduction/kotlin-with-intellij-idea/view-of-main.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/kotlin-with-intellij-idea/view-of-main.PNG -------------------------------------------------------------------------------- /assets/img/introduction/kotlin-with-intellij-idea/welcome-to-intellij-idea.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/kotlin-with-intellij-idea/welcome-to-intellij-idea.PNG -------------------------------------------------------------------------------- /assets/img/introduction/lambda-expressions-in-kotlin/result-1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/lambda-expressions-in-kotlin/result-1.PNG -------------------------------------------------------------------------------- /assets/img/introduction/loops-and-ranges-in-kotlin/view-of-class.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/loops-and-ranges-in-kotlin/view-of-class.PNG -------------------------------------------------------------------------------- /assets/img/introduction/null-safety-and-summary/result-1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/null-safety-and-summary/result-1.PNG -------------------------------------------------------------------------------- /assets/img/introduction/package-and-imports-in-kotlin-and-summary-of-kotlin-basic/someutils.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/package-and-imports-in-kotlin-and-summary-of-kotlin-basic/someutils.PNG -------------------------------------------------------------------------------- /assets/img/introduction/talking-to-kotlin-from-java/completion-2.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/talking-to-kotlin-from-java/completion-2.PNG -------------------------------------------------------------------------------- /assets/img/introduction/talking-to-kotlin-from-java/completion-3.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/talking-to-kotlin-from-java/completion-3.PNG -------------------------------------------------------------------------------- /assets/img/introduction/talking-to-kotlin-from-java/error-1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/talking-to-kotlin-from-java/error-1.PNG -------------------------------------------------------------------------------- /assets/img/introduction/talking-to-kotlin-from-java/warning-1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/talking-to-kotlin-from-java/warning-1.PNG -------------------------------------------------------------------------------- /assets/img/introduction/talking-to-kotlin-from-java/warning-2.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/talking-to-kotlin-from-java/warning-2.PNG -------------------------------------------------------------------------------- /assets/img/introduction/the-kotlin-repl/bye-repl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/the-kotlin-repl/bye-repl.png -------------------------------------------------------------------------------- /assets/img/introduction/the-kotlin-repl/hello-fun.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/the-kotlin-repl/hello-fun.png -------------------------------------------------------------------------------- /assets/img/introduction/the-kotlin-repl/hello-world.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/the-kotlin-repl/hello-world.png -------------------------------------------------------------------------------- /assets/img/introduction/the-kotlin-repl/kotlinc-command.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/the-kotlin-repl/kotlinc-command.png -------------------------------------------------------------------------------- /assets/img/introduction/the-kotlin-repl/repl-in-idea.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/the-kotlin-repl/repl-in-idea.png -------------------------------------------------------------------------------- /assets/img/introduction/top-level-functions-and-properties-in-kotlin/output-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/top-level-functions-and-properties-in-kotlin/output-1.png -------------------------------------------------------------------------------- /assets/img/introduction/top-level-functions-and-properties-in-kotlin/output-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/top-level-functions-and-properties-in-kotlin/output-2.png -------------------------------------------------------------------------------- /assets/img/introduction/type-casting-in-kotlin/result-1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/type-casting-in-kotlin/result-1.PNG -------------------------------------------------------------------------------- /assets/img/introduction/working-with-exceptions/result-1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/working-with-exceptions/result-1.PNG -------------------------------------------------------------------------------- /assets/img/introduction/working-with-exceptions/result-2.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/introduction/working-with-exceptions/result-2.PNG -------------------------------------------------------------------------------- /assets/img/js/hello-world/blank-project.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/js/hello-world/blank-project.png -------------------------------------------------------------------------------- /assets/img/js/hello-world/build-project.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/js/hello-world/build-project.png -------------------------------------------------------------------------------- /assets/img/js/hello-world/chrome-output.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/js/hello-world/chrome-output.png -------------------------------------------------------------------------------- /assets/img/js/hello-world/create-new-project.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/js/hello-world/create-new-project.png -------------------------------------------------------------------------------- /assets/img/js/hello-world/creating-mainkt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/js/hello-world/creating-mainkt.png -------------------------------------------------------------------------------- /assets/img/js/hello-world/name-project.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/js/hello-world/name-project.png -------------------------------------------------------------------------------- /assets/img/js/hello-world/output-files.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/js/hello-world/output-files.png -------------------------------------------------------------------------------- /assets/img/js/hello-world/target-kotlin-javascript.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/js/hello-world/target-kotlin-javascript.png -------------------------------------------------------------------------------- /assets/img/js/working-with-the-dom-part1/output1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/js/working-with-the-dom-part1/output1.png -------------------------------------------------------------------------------- /assets/img/js/working-with-the-dom-part1/output2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/js/working-with-the-dom-part1/output2.png -------------------------------------------------------------------------------- /assets/img/js/working-with-the-dom-part1/output3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/js/working-with-the-dom-part1/output3.png -------------------------------------------------------------------------------- /assets/img/js/working-with-the-dom-part1/output4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/js/working-with-the-dom-part1/output4.png -------------------------------------------------------------------------------- /assets/img/js/working-with-the-dom-part1/output5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/js/working-with-the-dom-part1/output5.png -------------------------------------------------------------------------------- /assets/img/js/working-with-the-dom-part1/output6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/js/working-with-the-dom-part1/output6.png -------------------------------------------------------------------------------- /assets/img/js/working-with-the-dom-part1/output7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/js/working-with-the-dom-part1/output7.png -------------------------------------------------------------------------------- /assets/img/js/working-with-the-dom-part1/output8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/js/working-with-the-dom-part1/output8.png -------------------------------------------------------------------------------- /assets/img/js/working-with-the-dom-part1/output9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/js/working-with-the-dom-part1/output9.png -------------------------------------------------------------------------------- /assets/img/js/working-with-the-dom-part3/IDE-workspace.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/js/working-with-the-dom-part3/IDE-workspace.png -------------------------------------------------------------------------------- /assets/img/js/working-with-the-dom-part3/add-as-library.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/js/working-with-the-dom-part3/add-as-library.png -------------------------------------------------------------------------------- /assets/img/js/working-with-the-dom-part3/bitnary-download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/js/working-with-the-dom-part3/bitnary-download.png -------------------------------------------------------------------------------- /assets/img/js/working-with-the-dom-part3/choose-categories-of-selected-files.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/js/working-with-the-dom-part3/choose-categories-of-selected-files.png -------------------------------------------------------------------------------- /assets/img/js/working-with-the-dom-part3/dl-bitnary-link.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/js/working-with-the-dom-part3/dl-bitnary-link.png -------------------------------------------------------------------------------- /assets/img/js/working-with-the-dom-part3/kotlinx-download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/js/working-with-the-dom-part3/kotlinx-download.png -------------------------------------------------------------------------------- /assets/img/js/working-with-the-dom-part3/lib-contains.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/js/working-with-the-dom-part3/lib-contains.png -------------------------------------------------------------------------------- /assets/img/js/working-with-the-dom-part3/link-of-others-kotlinx-version.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/js/working-with-the-dom-part3/link-of-others-kotlinx-version.png -------------------------------------------------------------------------------- /assets/img/posts/2017-4-4-kotlin-native-tech-preview-kotlin-without-a-vm/kotlin-native.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/posts/2017-4-4-kotlin-native-tech-preview-kotlin-without-a-vm/kotlin-native.png -------------------------------------------------------------------------------- /assets/img/posts/2017-5-17-kotlin-on-android-now-official/android_kotlin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/posts/2017-5-17-kotlin-on-android-now-official/android_kotlin.png -------------------------------------------------------------------------------- /assets/img/posts/2018-5-1-running-restful-app-with-spring-boot-and-kotlin/kotlin-spring-boot-restful-web-service.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/posts/2018-5-1-running-restful-app-with-spring-boot-and-kotlin/kotlin-spring-boot-restful-web-service.jpg -------------------------------------------------------------------------------- /assets/img/posts/2018-5-1-running-restful-app-with-spring-boot-and-kotlin/new-project.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/posts/2018-5-1-running-restful-app-with-spring-boot-and-kotlin/new-project.png -------------------------------------------------------------------------------- /assets/img/posts/2018-5-1-running-restful-app-with-spring-boot-and-kotlin/new-project2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/posts/2018-5-1-running-restful-app-with-spring-boot-and-kotlin/new-project2.png -------------------------------------------------------------------------------- /assets/img/posts/2018-5-1-running-restful-app-with-spring-boot-and-kotlin/new-project3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/posts/2018-5-1-running-restful-app-with-spring-boot-and-kotlin/new-project3.png -------------------------------------------------------------------------------- /assets/img/posts/2018-5-1-running-restful-app-with-spring-boot-and-kotlin/tree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/posts/2018-5-1-running-restful-app-with-spring-boot-and-kotlin/tree.png -------------------------------------------------------------------------------- /assets/img/posts/2019-05-24-new-kotlinfarsi/edit-github-btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/posts/2019-05-24-new-kotlinfarsi/edit-github-btn.png -------------------------------------------------------------------------------- /assets/img/posts/2019-05-24-new-kotlinfarsi/kotlinfarsi-back-full.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/posts/2019-05-24-new-kotlinfarsi/kotlinfarsi-back-full.jpg -------------------------------------------------------------------------------- /assets/img/posts/2019-05-24-new-kotlinfarsi/radio-kotlin-farsi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/posts/2019-05-24-new-kotlinfarsi/radio-kotlin-farsi.png -------------------------------------------------------------------------------- /assets/img/posts/2019-05-24-new-kotlinfarsi/try-it.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/posts/2019-05-24-new-kotlinfarsi/try-it.png -------------------------------------------------------------------------------- /assets/img/posts/2019-05-24-new-kotlinfarsi/tutorials.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/posts/2019-05-24-new-kotlinfarsi/tutorials.png -------------------------------------------------------------------------------- /assets/img/posts/2019-06-24-kotlin-everywhere-report/Ktor.odp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/posts/2019-06-24-kotlin-everywhere-report/Ktor.odp -------------------------------------------------------------------------------- /assets/img/posts/2019-06-24-kotlin-everywhere-report/injori.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/posts/2019-06-24-kotlin-everywhere-report/injori.jpg -------------------------------------------------------------------------------- /assets/img/posts/2019-06-24-kotlin-everywhere-report/keyvan-esbati-kotlin-dsl.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/posts/2019-06-24-kotlin-everywhere-report/keyvan-esbati-kotlin-dsl.jpg -------------------------------------------------------------------------------- /assets/img/posts/2019-06-24-kotlin-everywhere-report/kotlin-farsi-year-plan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/posts/2019-06-24-kotlin-everywhere-report/kotlin-farsi-year-plan.png -------------------------------------------------------------------------------- /assets/img/posts/2019-06-24-kotlin-everywhere-report/sina-darvishi-keynote.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/posts/2019-06-24-kotlin-everywhere-report/sina-darvishi-keynote.jpg -------------------------------------------------------------------------------- /assets/img/posts/2019-06-24-kotlin-everywhere-report/sina-darvishi-kotlinjs.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/posts/2019-06-24-kotlin-everywhere-report/sina-darvishi-kotlinjs.jpg -------------------------------------------------------------------------------- /assets/img/posts/2019-06-24-kotlin-everywhere-report/sina-rezayi-ktor.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/posts/2019-06-24-kotlin-everywhere-report/sina-rezayi-ktor.jpg -------------------------------------------------------------------------------- /assets/img/posts/2019-06-24-kotlin-everywhere-report/vahid-mavaji-functional.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/img/posts/2019-06-24-kotlin-everywhere-report/vahid-mavaji-functional.jpg -------------------------------------------------------------------------------- /assets/profile/sina_darvishi.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/assets/profile/sina_darvishi.jpg -------------------------------------------------------------------------------- /category.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: Category 4 | permalink: /category/ 5 | --- 6 | 7 |
    8 |

    Category

    9 | 10 |
      11 | 12 | {% capture categories %}{% for category in site.categories %}{{ category | first }}{% unless forloop.last %},{% endunless %}{% endfor %}{% endcapture %} 13 | {% assign category = categories | split:',' | sort %} 14 | {% for item in (0..site.categories.size) %}{% unless forloop.last %} 15 | {% capture word %}{{ category[item] | strip_newlines }}{% endcapture %} 16 |

      {{ word | upcase }}

      17 |
        18 | {% for post in site.categories[word] %}{% if post.title != null %} 19 |
      • {{ post.date | date: "%b %d" }} » {{ post.title }}
      • 20 | {% endif %}{% endfor %} 21 |
      22 | {% endunless %}{% endfor %} 23 | 24 |
    25 | 26 |
    27 | -------------------------------------------------------------------------------- /feed.xml: -------------------------------------------------------------------------------- 1 | --- 2 | layout: null 3 | --- 4 | 5 | 6 | 7 | {{ site.title | xml_escape }} 8 | {{ site.description | xml_escape }} 9 | {{ site.url }}{{ site.baseurl }}/ 10 | 11 | {{ site.time | date_to_rfc822 }} 12 | {{ site.time | date_to_rfc822 }} 13 | Jekyll v{{ jekyll.version }} 14 | {% for post in site.posts limit:10 %} 15 | 16 | {{ post.title | xml_escape }} 17 | {{ post.content | xml_escape }} 18 | {{ post.date | date_to_rfc822 }} 19 | {{ post.url | prepend: site.baseurl | prepend: site.url }} 20 | {{ post.url | prepend: site.baseurl | prepend: site.url }} 21 | {% for tag in post.tags %} 22 | {{ tag | xml_escape }} 23 | {% endfor %} 24 | {% for cat in post.categories %} 25 | {{ cat | xml_escape }} 26 | {% endfor %} 27 | 28 | {% endfor %} 29 | 30 | 31 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | --- 4 | 5 |
    6 |

    مقاله ها

    7 | 8 |
      9 | {% for post in paginator.posts %} 10 | {% include post-item.html %} 11 | {% endfor %} 12 |
    13 | 14 | 15 | 28 | 29 |
    30 | -------------------------------------------------------------------------------- /kotlinfarsi-new.svg: -------------------------------------------------------------------------------- 1 | kotlinfarsi-newKotlin -------------------------------------------------------------------------------- /kotlinfarsi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/KotlinFarsi-WebSite/32824cce0853454408fd6a3e4a445fcf7f617dda/kotlinfarsi.png -------------------------------------------------------------------------------- /radio.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | title: رادیو کاتلین 4 | permalink: /radio/ 5 | --- 6 |
    7 |

    به زودی مصاحبه هایتان را در اینجا می بینید!

    8 |
    9 | -------------------------------------------------------------------------------- /serve: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | PARAMS="" 4 | [ -e "$PORT" ] || PARAMS="$PARAMS -P $PORT" 5 | [ -e "$IP" ] || PARAMS="$PARAMS -H $IP" 6 | bundle exec jekyll serve $PARAMS || cat< 8 |

    کاتلین رو امتحان کن

    9 | 10 |
    11 |
    12 |
    13 |                 
    14 | /**
    15 | * کدت رو میتونی اینجا بنویسی و تست کنی
    16 | */
    17 | fun main(){
    18 |     println("Hello, KotlinFarsi!")
    19 | }
    20 | 
    21 | 
    22 | 
    23 | /**
    24 | * !روی دکمه سبز کلیک کن و نتیجه اش رو ببین
    25 | */
    26 |                 
    27 |             
    28 |
    29 |
    30 |
    31 | -------------------------------------------------------------------------------- /tutorials.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | title: دوره ها 4 | permalink: /tutorials/ 5 | --- 6 | 7 |
    8 |

    دوره ها

    9 | 10 | 11 | 12 | دوره مقدماتی کاتلین 13 | 14 | 15 | 16 |

    دوره پیشرفته کاتلین

    17 | 18 |
    19 | 20 | دوره اندروید 21 | 22 | 23 | 24 |

    دوره کاتلین/JS

    25 |
    26 |
    27 | 28 |

    دوره کاتلین/Native

    29 |
    30 | 31 | 32 |

    مجموعه دوره های Android Jetpack

    33 |
    34 |
    35 | 36 |
    --------------------------------------------------------------------------------