895 lines
54 KiB
HTML
895 lines
54 KiB
HTML
<!DOCTYPE HTML>
|
||
<html lang="en" class="coal" dir="ltr">
|
||
<head>
|
||
<!-- Book generated using mdBook -->
|
||
<meta charset="UTF-8">
|
||
<title>learn swift basics - Andrew's Blog</title>
|
||
|
||
|
||
<!-- Custom HTML head -->
|
||
|
||
<meta name="description" content="Andrew Ryan's Blog">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||
<meta name="theme-color" content="#ffffff">
|
||
|
||
<link rel="icon" href="../../favicon.svg">
|
||
<link rel="shortcut icon" href="../../favicon.png">
|
||
<link rel="stylesheet" href="../../css/variables.css">
|
||
<link rel="stylesheet" href="../../css/general.css">
|
||
<link rel="stylesheet" href="../../css/chrome.css">
|
||
|
||
<!-- Fonts -->
|
||
<link rel="stylesheet" href="../../FontAwesome/css/font-awesome.css">
|
||
<link rel="stylesheet" href="../../fonts/fonts.css">
|
||
|
||
<!-- Highlight.js Stylesheets -->
|
||
<link rel="stylesheet" href="../../highlight.css">
|
||
<link rel="stylesheet" href="../../tomorrow-night.css">
|
||
<link rel="stylesheet" href="../../ayu-highlight.css">
|
||
|
||
<!-- Custom theme stylesheets -->
|
||
<link rel="stylesheet" href="../../src/style/custom.css">
|
||
|
||
<!-- MathJax -->
|
||
<script async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
|
||
</head>
|
||
<body class="sidebar-visible no-js">
|
||
<div id="body-container">
|
||
<!-- Provide site root to javascript -->
|
||
<script>
|
||
var path_to_root = "../../";
|
||
var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "coal" : "coal";
|
||
</script>
|
||
|
||
<!-- Work around some values being stored in localStorage wrapped in quotes -->
|
||
<script>
|
||
try {
|
||
var theme = localStorage.getItem('mdbook-theme');
|
||
var sidebar = localStorage.getItem('mdbook-sidebar');
|
||
|
||
if (theme.startsWith('"') && theme.endsWith('"')) {
|
||
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
|
||
}
|
||
|
||
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
|
||
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
|
||
}
|
||
} catch (e) { }
|
||
</script>
|
||
|
||
<!-- Set the theme before any content is loaded, prevents flash -->
|
||
<script>
|
||
var theme;
|
||
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
|
||
if (theme === null || theme === undefined) { theme = default_theme; }
|
||
var html = document.querySelector('html');
|
||
html.classList.remove('coal')
|
||
html.classList.add(theme);
|
||
var body = document.querySelector('body');
|
||
body.classList.remove('no-js')
|
||
body.classList.add('js');
|
||
</script>
|
||
|
||
<input type="checkbox" id="sidebar-toggle-anchor" class="hidden">
|
||
|
||
<!-- Hide / unhide sidebar before it is displayed -->
|
||
<script>
|
||
var body = document.querySelector('body');
|
||
var sidebar = null;
|
||
var sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
|
||
if (document.body.clientWidth >= 1080) {
|
||
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
|
||
sidebar = sidebar || 'visible';
|
||
} else {
|
||
sidebar = 'hidden';
|
||
}
|
||
sidebar_toggle.checked = sidebar === 'visible';
|
||
body.classList.remove('sidebar-visible');
|
||
body.classList.add("sidebar-" + sidebar);
|
||
</script>
|
||
|
||
<nav id="sidebar" class="sidebar" aria-label="Table of contents">
|
||
<div class="sidebar-scrollbox">
|
||
<ol class="chapter"><li class="chapter-item affix "><a href="../../index.html">Andrew's Blog</a></li><li class="chapter-item "><a href="../../posts/linux/linux.html"><strong aria-hidden="true">1.</strong> linux</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/linux/install_linux.html"><strong aria-hidden="true">1.1.</strong> install linux</a></li><li class="chapter-item "><a href="../../posts/linux/bash_profile.html"><strong aria-hidden="true">1.2.</strong> bash profile</a></li><li class="chapter-item "><a href="../../posts/linux/command_list.html"><strong aria-hidden="true">1.3.</strong> command list</a></li><li class="chapter-item "><a href="../../posts/linux/git_guide.html"><strong aria-hidden="true">1.4.</strong> git guide</a></li><li class="chapter-item "><a href="../../posts/linux/tar.html"><strong aria-hidden="true">1.5.</strong> tar</a></li><li class="chapter-item "><a href="../../posts/linux/run_x86_elf_in_x64_setup.html"><strong aria-hidden="true">1.6.</strong> run x86 elf in x64 setup</a></li></ol></li><li class="chapter-item "><a href="../../posts/mac/mac.html"><strong aria-hidden="true">2.</strong> mac</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/mac/macos_profiles.html"><strong aria-hidden="true">2.1.</strong> macos profiles</a></li></ol></li><li class="chapter-item expanded "><a href="../../posts/swift/swift.html"><strong aria-hidden="true">3.</strong> swift</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item expanded "><a href="../../posts/swift/learn_swift.html" class="active"><strong aria-hidden="true">3.1.</strong> learn swift basics</a></li><li class="chapter-item "><a href="../../posts/swift/swift_extensions.html"><strong aria-hidden="true">3.2.</strong> Swift extensions</a></li><li class="chapter-item "><a href="../../posts/swift/swiftui_extension.html"><strong aria-hidden="true">3.3.</strong> SwiftUI extensions</a></li><li class="chapter-item "><a href="../../posts/swift/install_swift.html"><strong aria-hidden="true">3.4.</strong> install swift</a></li><li class="chapter-item "><a href="../../posts/swift/task_planner.html"><strong aria-hidden="true">3.5.</strong> implment task panner app with SwiftUI</a></li><li class="chapter-item "><a href="../../posts/swift/swift_cheat_sheet.html"><strong aria-hidden="true">3.6.</strong> Swift Cheat Sheet</a></li><li class="chapter-item "><a href="../../posts/swift/yinci_url.html"><strong aria-hidden="true">3.7.</strong> Personal privacy protocol</a></li><li class="chapter-item "><a href="../../posts/swift/swift_regular_exressions.html"><strong aria-hidden="true">3.8.</strong> Swift regular exressions</a></li><li class="chapter-item "><a href="../../posts/ios/how_to_create_beautiful_ios_charts_in_swift.html"><strong aria-hidden="true">3.9.</strong> How to Create Beautiful iOS Charts in鑱絊wift</a></li><li class="chapter-item "><a href="../../posts/swift/swiftui_source_code.html"><strong aria-hidden="true">3.10.</strong> SwiftUI source code</a></li><li class="chapter-item "><a href="../../posts/swift/use_swift_fetch_iciba_api.html"><strong aria-hidden="true">3.11.</strong> use swift fetch iciba API</a></li></ol></li><li class="chapter-item "><a href="../../posts/ios/ios.html"><strong aria-hidden="true">4.</strong> ios</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/ios/cocaposd_setup_and_install_for_ios_project.html"><strong aria-hidden="true">4.1.</strong> cocaposd setup and install for ios project</a></li><li class="chapter-item "><a href="../../posts/ios/swiftui_show_gif_image.html"><strong aria-hidden="true">4.2.</strong> SwiftUI show gif image</a></li><li class="chapter-item "><a href="../../posts/ios/implement_task_planner_app.html"><strong aria-hidden="true">4.3.</strong> implement Task planner App</a></li></ol></li><li class="chapter-item "><a href="../../posts/objective_c/objective_c.html"><strong aria-hidden="true">5.</strong> objective_c</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/objective_c/objective_c_cheat_sheet.html"><strong aria-hidden="true">5.1.</strong> Objective-C Cheat Sheet</a></li><li class="chapter-item "><a href="../../posts/objective_c/objective_c_for_absolute_beginners_read_note.html"><strong aria-hidden="true">5.2.</strong> Objective-C Note</a></li></ol></li><li class="chapter-item "><a href="../../posts/dart/dart.html"><strong aria-hidden="true">6.</strong> dart</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/dart/flutter.html"><strong aria-hidden="true">6.1.</strong> Flutter Cheat Sheet</a></li><li class="chapter-item "><a href="../../posts/dart/dart_cheat_sheet.html"><strong aria-hidden="true">6.2.</strong> Dart Cheat Sheet</a></li><li class="chapter-item "><a href="../../posts/flutter/flutter_dev_test.html"><strong aria-hidden="true">6.3.</strong> Flutter dev test</a></li></ol></li><li class="chapter-item "><a href="../../posts/rust/rust.html"><strong aria-hidden="true">7.</strong> rust</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/rust/offline_use_rust.html"><strong aria-hidden="true">7.1.</strong> Offline use rust</a></li><li class="chapter-item "><a href="../../posts/rust/rust_grammer.html"><strong aria-hidden="true">7.2.</strong> rust grammar</a></li><li class="chapter-item "><a href="../../posts/rust/pase_string_and_decimal_conversion.html"><strong aria-hidden="true">7.3.</strong> pase string and decimal conversion</a></li><li class="chapter-item "><a href="../../posts/rust/parse_types.html"><strong aria-hidden="true">7.4.</strong> rust types</a></li><li class="chapter-item "><a href="../../posts/rust/rust_life_cycle.html"><strong aria-hidden="true">7.5.</strong> Rust life cycle</a></li><li class="chapter-item "><a href="../../posts/rust/rust_generic.html"><strong aria-hidden="true">7.6.</strong> rust generics</a></li><li class="chapter-item "><a href="../../posts/rust/rust_implment_matrix.html"><strong aria-hidden="true">7.7.</strong> Rust implement matrix</a></li><li class="chapter-item "><a href="../../posts/rust/rust_sort.html"><strong aria-hidden="true">7.8.</strong> Rust implement sort algorithms</a></li><li class="chapter-item "><a href="../../posts/rust/implement_aes_encryption.html"><strong aria-hidden="true">7.9.</strong> Rust implement AEC encryption and decryption</a></li><li class="chapter-item "><a href="../../posts/rust/implement_trie_data_structure.html"><strong aria-hidden="true">7.10.</strong> implement trie data structure</a></li><li class="chapter-item "><a href="../../posts/rust/rust_implement_tree.html"><strong aria-hidden="true">7.11.</strong> implement tree data_structure</a></li><li class="chapter-item "><a href="../../posts/rust/list_dir.html"><strong aria-hidden="true">7.12.</strong> list dir</a></li><li class="chapter-item "><a href="../../posts/rust/fast_way_to_implment_object_trait.html"><strong aria-hidden="true">7.13.</strong> fast way to implment object trait</a></li><li class="chapter-item "><a href="../../posts/rust/compress_rust_binary_size.html"><strong aria-hidden="true">7.14.</strong> compress rust binary size</a></li><li class="chapter-item "><a href="../../posts/rust/implment_file_upload_backend.html"><strong aria-hidden="true">7.15.</strong> impliment file upload</a></li><li class="chapter-item "><a href="../../posts/rust/this_is_add_post_cli_implementation_in_rust.html"><strong aria-hidden="true">7.16.</strong> this is add_post cli implementation in rust</a></li><li class="chapter-item "><a href="../../posts/rust/use_rust_implment_a_copyclipbord_cli.html"><strong aria-hidden="true">7.17.</strong> Use rust implment a copyclipbord CLI</a></li><li class="chapter-item "><a href="../../posts/rust/sqlite_database_add_delete_update_show_in_rust.html"><strong aria-hidden="true">7.18.</strong> sqlite database add delete update show in rust</a></li><li class="chapter-item "><a href="../../posts/rust/implementing_tokio_joinhandle_for_wasm.html"><strong aria-hidden="true">7.19.</strong> Implementing tokio JoinHandle for wasm</a></li><li class="chapter-item "><a href="../../posts/rust/rust_implement_a_crate_for_encode_and_decode_brainfuck_and_ook.html"><strong aria-hidden="true">7.20.</strong> rust implement a crate for encode and decode brainfuck and ook</a></li><li class="chapter-item "><a href="../../posts/rust/slint_builtin_elements.html"><strong aria-hidden="true">7.21.</strong> Slint Builtin Elements</a></li><li class="chapter-item "><a href="../../posts/rust/corporate_network_install_rust_on_windows.html"><strong aria-hidden="true">7.22.</strong> Corporate network install Rust on windows</a></li><li class="chapter-item "><a href="../../posts/rust/rust_binary_file_how_to_judge_static_link_or_dynamic_link_in_macos.html"><strong aria-hidden="true">7.23.</strong> rust binary file how to judge static link or dynamic link in Macos</a></li><li class="chapter-item "><a href="../../posts/rust/rust_binary_include_dir_and_get_contents.html"><strong aria-hidden="true">7.24.</strong> rust binary include dir and get contents</a></li><li class="chapter-item "><a href="../../posts/rust/rust_logger_non-block.html"><strong aria-hidden="true">7.25.</strong> rust logger non-block</a></li><li class="chapter-item "><a href="../../posts/rust/rust_connect_sql_server_database.html"><strong aria-hidden="true">7.26.</strong> rust connect sql server database</a></li><li class="chapter-item "><a href="../../posts/rust/rust_websocket_implment.html"><strong aria-hidden="true">7.27.</strong> rust websocket implment</a></li></ol></li><li class="chapter-item "><a href="../../posts/java/java.html"><strong aria-hidden="true">8.</strong> java</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/java/java_grammar.html"><strong aria-hidden="true">8.1.</strong> java grammar and codewar</a></li><li class="chapter-item "><a href="../../posts/java/run_jar.html"><strong aria-hidden="true">8.2.</strong> java run .jar</a></li><li class="chapter-item "><a href="../../posts/java/java_pomxml_add_defaultgoal_to_build.html"><strong aria-hidden="true">8.3.</strong> Java pomxml add defaultGoal to build</a></li><li class="chapter-item "><a href="../../posts/java/java_set_mvn_mirror.html"><strong aria-hidden="true">8.4.</strong> Java set mvn mirror</a></li></ol></li><li class="chapter-item "><a href="../../posts/python/python.html"><strong aria-hidden="true">9.</strong> python</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/python/convert_pesn.html"><strong aria-hidden="true">9.1.</strong> convert pesn</a></li><li class="chapter-item "><a href="../../posts/python/find_remove_dir.html"><strong aria-hidden="true">9.2.</strong> find and remove dir</a></li><li class="chapter-item "><a href="../../posts/python/timing_message.html"><strong aria-hidden="true">9.3.</strong> wechat send message</a></li><li class="chapter-item "><a href="../../posts/python/use_python_openpyxl_package_read_and_edit_excel_files.html"><strong aria-hidden="true">9.4.</strong> Use python openpyxl package read and edit excel files</a></li></ol></li><li class="chapter-item "><a href="../../posts/go/go.html"><strong aria-hidden="true">10.</strong> go</a></li><li class="chapter-item "><a href="../../posts/js/js.html"><strong aria-hidden="true">11.</strong> js</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/js/js_tutorial.html"><strong aria-hidden="true">11.1.</strong> js tutorial</a></li><li class="chapter-item "><a href="../../posts/js/js_tutorial_map.html"><strong aria-hidden="true">11.2.</strong> ja map</a></li><li class="chapter-item "><a href="../../posts/js/js_tutorial_math.html"><strong aria-hidden="true">11.3.</strong> js math</a></li><li class="chapter-item "><a href="../../posts/js/js_tutorial_object.html"><strong aria-hidden="true">11.4.</strong> js object</a></li><li class="chapter-item "><a href="../../posts/js/js_tutorial_set.html"><strong aria-hidden="true">11.5.</strong> js set</a></li><li class="chapter-item "><a href="../../posts/js/single_thread_and_asynchronous.html"><strong aria-hidden="true">11.6.</strong> single thread and asynchronous</a></li><li class="chapter-item "><a href="../../posts/js/this.html"><strong aria-hidden="true">11.7.</strong> js this</a></li><li class="chapter-item "><a href="../../posts/js/js_implment_aes.html"><strong aria-hidden="true">11.8.</strong> js implment aes</a></li><li class="chapter-item "><a href="../../posts/js/getting_started_with_ajax.html"><strong aria-hidden="true">11.9.</strong> getting started with ajax</a></li><li class="chapter-item "><a href="../../posts/js/BinarySearchTree.html"><strong aria-hidden="true">11.10.</strong> binary search tree</a></li><li class="chapter-item "><a href="../../posts/js/goole_zx.html"><strong aria-hidden="true">11.11.</strong> goole zx</a></li><li class="chapter-item "><a href="../../posts/js/es6.html"><strong aria-hidden="true">11.12.</strong> es6</a></li></ol></li><li class="chapter-item "><a href="../../posts/ruby/ruby.html"><strong aria-hidden="true">12.</strong> ruby</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/ruby/rails_setup_env.html"><strong aria-hidden="true">12.1.</strong> ruby on rails setup environment</a></li><li class="chapter-item "><a href="../../posts/ruby/learn_ruby.html"><strong aria-hidden="true">12.2.</strong> learn ruby</a></li><li class="chapter-item "><a href="../../posts/ruby/ruby_note.html"><strong aria-hidden="true">12.3.</strong> Ruby Note</a></li><li class="chapter-item "><a href="../../posts/ruby/setup_ruby_for_ctf.html"><strong aria-hidden="true">12.4.</strong> Setup ruby for CTF</a></li></ol></li><li class="chapter-item "><a href="../../posts/react/react.html"><strong aria-hidden="true">13.</strong> react</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/react/react_life_cycle.html"><strong aria-hidden="true">13.1.</strong> react life cycle</a></li><li class="chapter-item "><a href="../../posts/react/react_router.html"><strong aria-hidden="true">13.2.</strong> react router</a></li><li class="chapter-item "><a href="../../posts/react/react_this.html"><strong aria-hidden="true">13.3.</strong> react this</a></li><li class="chapter-item "><a href="../../posts/react/react_interviw.html"><strong aria-hidden="true">13.4.</strong> react interview</a></li><li class="chapter-item "><a href="../../posts/react/important_react_interview.html"><strong aria-hidden="true">13.5.</strong> important react interview</a></li><li class="chapter-item "><a href="../../posts/react/react_quick_reference.html"><strong aria-hidden="true">13.6.</strong> react quick reference</a></li><li class="chapter-item "><a href="../../posts/react/redux_quick_reference.html"><strong aria-hidden="true">13.7.</strong> redux quick reference</a></li></ol></li><li class="chapter-item "><a href="../../posts/vue/vue.html"><strong aria-hidden="true">14.</strong> vue</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/vue/vue_ajax.html"><strong aria-hidden="true">14.1.</strong> vue ajax</a></li></ol></li><li class="chapter-item "><a href="../../posts/angular/angular.html"><strong aria-hidden="true">15.</strong> angular</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/angular/controller_communication.html"><strong aria-hidden="true">15.1.</strong> controller communication</a></li><li class="chapter-item "><a href="../../posts/angular/creating_custom_directives.html"><strong aria-hidden="true">15.2.</strong> creating custom directives</a></li><li class="chapter-item "><a href="../../posts/angular/directive_notes.html"><strong aria-hidden="true">15.3.</strong> directive notes</a></li><li class="chapter-item "><a href="../../posts/angular/directive_communication.html"><strong aria-hidden="true">15.4.</strong> directive communication</a></li><li class="chapter-item "><a href="../../posts/angular/post_params.html"><strong aria-hidden="true">15.5.</strong> post params</a></li><li class="chapter-item "><a href="../../posts/angular/read_json_angular.html"><strong aria-hidden="true">15.6.</strong> read json angular</a></li><li class="chapter-item "><a href="../../posts/angular/same_route_reload.html"><strong aria-hidden="true">15.7.</strong> same route reload</a></li></ol></li><li class="chapter-item "><a href="../../posts/css/css.html"><strong aria-hidden="true">16.</strong> css</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/css/use_css_media.html"><strong aria-hidden="true">16.1.</strong> use css media</a></li></ol></li><li class="chapter-item "><a href="../../posts/php/php.html"><strong aria-hidden="true">17.</strong> php</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/php/for_php_string_implment_some_extemtion_functions.html"><strong aria-hidden="true">17.1.</strong> for php string implment some extemtion functions</a></li><li class="chapter-item "><a href="../../posts/php/php_cheatsheet.html"><strong aria-hidden="true">17.2.</strong> PHP cheatsheet</a></li></ol></li><li class="chapter-item "><a href="../../posts/leetcode/leetcode.html"><strong aria-hidden="true">18.</strong> leetcode</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/leetcode/rust_leetcode.html"><strong aria-hidden="true">18.1.</strong> rust leetcode</a></li><li class="chapter-item "><a href="../../posts/leetcode/rust_codewar.html"><strong aria-hidden="true">18.2.</strong> rust codewar</a></li><li class="chapter-item "><a href="../../posts/leetcode/swift_codewar.html"><strong aria-hidden="true">18.3.</strong> swift codewar</a></li><li class="chapter-item "><a href="../../posts/leetcode/js_leetcode.html"><strong aria-hidden="true">18.4.</strong> js leetcode</a></li><li class="chapter-item "><a href="../../posts/leetcode/java_leetcode.html"><strong aria-hidden="true">18.5.</strong> java leetcode</a></li><li class="chapter-item "><a href="../../posts/leetcode/rust_huawei.html"><strong aria-hidden="true">18.6.</strong> huawei test</a></li><li class="chapter-item "><a href="../../posts/leetcode/rust_utils.html"><strong aria-hidden="true">18.7.</strong> rust common functions</a></li><li class="chapter-item "><a href="../../posts/leetcode/olympiad_training.html"><strong aria-hidden="true">18.8.</strong> Computer olympiad training</a></li></ol></li><li class="chapter-item "><a href="../../posts/ctf/CTF.html"><strong aria-hidden="true">19.</strong> ctf</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/ctf/CTF_Note.html"><strong aria-hidden="true">19.1.</strong> CTF Note</a></li><li class="chapter-item "><a href="../../posts/ctf/0.1_Web.html"><strong aria-hidden="true">19.2.</strong> Web</a></li><li class="chapter-item "><a href="../../posts/ctf/4.1_Misc.html"><strong aria-hidden="true">19.3.</strong> Misc</a></li><li class="chapter-item "><a href="../../posts/ctf/3.2_PWN_note.html"><strong aria-hidden="true">19.4.</strong> PWN</a></li><li class="chapter-item "><a href="../../posts/ctf/3.1_Crypto.html"><strong aria-hidden="true">19.5.</strong> Crypto</a></li><li class="chapter-item "><a href="../../posts/ctf/3.4_RSA_note.html"><strong aria-hidden="true">19.6.</strong> Rsa attack</a></li><li class="chapter-item "><a href="../../posts/ctf/3.5_Base64.html"><strong aria-hidden="true">19.7.</strong> Base64</a></li><li class="chapter-item "><a href="../../posts/ctf/0.0_SQL Injection Cheatsheet.html"><strong aria-hidden="true">19.8.</strong> SQL Injection Cheatsheet</a></li><li class="chapter-item "><a href="../../posts/ctf/1.1_SQL_injection.html"><strong aria-hidden="true">19.9.</strong> SQL Injection</a></li><li class="chapter-item "><a href="../../posts/ctf/1.2_SQL_injection_UNION_attacks.html"><strong aria-hidden="true">19.10.</strong> SQL Injection UNION attacks</a></li><li class="chapter-item "><a href="../../posts/ctf/1.3_Blind SQL injection.html"><strong aria-hidden="true">19.11.</strong> Blind SQL Injection</a></li><li class="chapter-item "><a href="../../posts/ctf/1.4_Code Injection.html"><strong aria-hidden="true">19.12.</strong> Code Injection</a></li><li class="chapter-item "><a href="../../posts/ctf/1.5_SSRF.html"><strong aria-hidden="true">19.13.</strong> SSRF</a></li><li class="chapter-item "><a href="../../posts/ctf/1.6_OS command injection.html"><strong aria-hidden="true">19.14.</strong> OS command injection</a></li><li class="chapter-item "><a href="../../posts/ctf/1.7_Local file inclusion.html"><strong aria-hidden="true">19.15.</strong> Local file inclusion</a></li><li class="chapter-item "><a href="../../posts/ctf/1.8_Remote file inclusion.html"><strong aria-hidden="true">19.16.</strong> Remote file inclusion</a></li><li class="chapter-item "><a href="../../posts/ctf/1.9_CSRFm.html"><strong aria-hidden="true">19.17.</strong> CSRF</a></li><li class="chapter-item "><a href="../../posts/ctf/1.10_NoSQL injection.html"><strong aria-hidden="true">19.18.</strong> NoSQL injection</a></li><li class="chapter-item "><a href="../../posts/ctf/1.11_JSON injection.html"><strong aria-hidden="true">19.19.</strong> JSON injection</a></li><li class="chapter-item "><a href="../../posts/ctf/1.12_CTF_Web_SQL_Note.html"><strong aria-hidden="true">19.20.</strong> CTF Web SQL Note</a></li><li class="chapter-item "><a href="../../posts/ctf/2.1_XXE.html"><strong aria-hidden="true">19.21.</strong> XXE</a></li><li class="chapter-item "><a href="../../posts/ctf/2.2_XSS.html"><strong aria-hidden="true">19.22.</strong> XSS</a></li><li class="chapter-item "><a href="../../posts/ctf/2.3_Upload File.html"><strong aria-hidden="true">19.23.</strong> Upload File</a></li><li class="chapter-item "><a href="../../posts/ctf/2.4_serialize_unserialize.html"><strong aria-hidden="true">19.24.</strong> serialize unserialize</a></li><li class="chapter-item "><a href="../../posts/ctf/2.5_Race condition.html"><strong aria-hidden="true">19.25.</strong> Race condition</a></li><li class="chapter-item "><a href="../../posts/ctf/3.2_PWN_note.html"><strong aria-hidden="true">19.26.</strong> PWN_note</a></li><li class="chapter-item "><a href="../../posts/ctf/3.3_pwn HCTF2016 brop.html"><strong aria-hidden="true">19.27.</strong> pwn HCTF2016 brop</a></li><li class="chapter-item "><a href="../../posts/ctf/pwn_patch_defense_skill.html"><strong aria-hidden="true">19.28.</strong> PWN Patch defense skill</a></li><li class="chapter-item "><a href="../../posts/ctf/pwn_stack_overflow.html"><strong aria-hidden="true">19.29.</strong> PWN stack overflow</a></li><li class="chapter-item "><a href="../../posts/ctf/pwn_heap_overflow.html"><strong aria-hidden="true">19.30.</strong> PWN heap overflow</a></li><li class="chapter-item "><a href="../../posts/ctf/pwn_format_string_vulnerability.html"><strong aria-hidden="true">19.31.</strong> PWN Format String Vulnerability</a></li><li class="chapter-item "><a href="../../posts/ctf/kali_linux_tutorials.html"><strong aria-hidden="true">19.32.</strong> Kali linux tutorials</a></li><li class="chapter-item "><a href="../../posts/ctf/google_dorks_2023_lists.html"><strong aria-hidden="true">19.33.</strong> Google Dorks 2023 Lists</a></li><li class="chapter-item "><a href="../../posts/ctf/dvwa_writeup.html"><strong aria-hidden="true">19.34.</strong> DVWA WriteUp</a></li><li class="chapter-item "><a href="../../posts/ctf/bwapp_writeup.html"><strong aria-hidden="true">19.35.</strong> bWAPP WriteUp</a></li><li class="chapter-item "><a href="../../posts/ctf/sqlilabs_writeup.html"><strong aria-hidden="true">19.36.</strong> sqlilabs WriteUp</a></li><li class="chapter-item "><a href="../../posts/ctf/ctf_train_at_hangzhou.html"><strong aria-hidden="true">19.37.</strong> ctf train at hangzhou</a></li><li class="chapter-item "><a href="../../posts/ctf/ctf_common_mindmap_list.html"><strong aria-hidden="true">19.38.</strong> ctf common mindmap list</a></li><li class="chapter-item "><a href="../../posts/ctf/error_based_sql_injection.html"><strong aria-hidden="true">19.39.</strong> Error Based SQL Injection</a></li><li class="chapter-item "><a href="../../posts/ctf/urlfinder_tutorial.html"><strong aria-hidden="true">19.40.</strong> URLFinder Tutorial</a></li><li class="chapter-item "><a href="../../posts/ctf/observer_ward_tutorial.html"><strong aria-hidden="true">19.41.</strong> observer_ward Tutorial</a></li><li class="chapter-item "><a href="../../posts/ctf/mysql_udf_.html"><strong aria-hidden="true">19.42.</strong> MySQL UDF 提权</a></li><li class="chapter-item "><a href="../../posts/ctf/nuclei__tutorial.html"><strong aria-hidden="true">19.43.</strong> Nuclei Tutorial</a></li><li class="chapter-item "><a href="../../posts/ctf/2024_ctf_solution_thinking.html"><strong aria-hidden="true">19.44.</strong> 2024 ctf solution thinking</a></li><li class="chapter-item "><a href="../../posts/ctf/man_che_si_te_bian_ma.html"><strong aria-hidden="true">19.45.</strong> 曼彻斯特编码</a></li></ol></li></ol>
|
||
</div>
|
||
<div id="sidebar-resize-handle" class="sidebar-resize-handle">
|
||
<div class="sidebar-resize-indicator"></div>
|
||
</div>
|
||
</nav>
|
||
|
||
<!-- Track and set sidebar scroll position -->
|
||
<script>
|
||
var sidebarScrollbox = document.querySelector('#sidebar .sidebar-scrollbox');
|
||
sidebarScrollbox.addEventListener('click', function(e) {
|
||
if (e.target.tagName === 'A') {
|
||
sessionStorage.setItem('sidebar-scroll', sidebarScrollbox.scrollTop);
|
||
}
|
||
}, { passive: true });
|
||
var sidebarScrollTop = sessionStorage.getItem('sidebar-scroll');
|
||
sessionStorage.removeItem('sidebar-scroll');
|
||
if (sidebarScrollTop) {
|
||
// preserve sidebar scroll position when navigating via links within sidebar
|
||
sidebarScrollbox.scrollTop = sidebarScrollTop;
|
||
} else {
|
||
// scroll sidebar to current active section when navigating via "next/previous chapter" buttons
|
||
var activeSection = document.querySelector('#sidebar .active');
|
||
if (activeSection) {
|
||
activeSection.scrollIntoView({ block: 'center' });
|
||
}
|
||
}
|
||
</script>
|
||
|
||
<div id="page-wrapper" class="page-wrapper">
|
||
|
||
<div class="page">
|
||
<div id="menu-bar-hover-placeholder"></div>
|
||
<div id="menu-bar" class="menu-bar sticky">
|
||
<div class="left-buttons">
|
||
<label id="sidebar-toggle" class="icon-button" for="sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
|
||
<i class="fa fa-bars"></i>
|
||
</label>
|
||
<button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
|
||
<i class="fa fa-paint-brush"></i>
|
||
</button>
|
||
<ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu">
|
||
<li role="none"><button role="menuitem" class="theme" id="light">Light</button></li>
|
||
<li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li>
|
||
<li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li>
|
||
<li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li>
|
||
<li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li>
|
||
</ul>
|
||
<button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar">
|
||
<i class="fa fa-search"></i>
|
||
</button>
|
||
</div>
|
||
|
||
<h1 class="menu-title">Andrew's Blog</h1>
|
||
|
||
<div class="right-buttons">
|
||
<a href="https://gitlink.org.cn/dnrops/dnrops.gitlink.net.git" title="Git repository" aria-label="Git repository">
|
||
<i id="git-repository-button" class="fa fa-github"></i>
|
||
</a>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div id="search-wrapper" class="hidden">
|
||
<form id="searchbar-outer" class="searchbar-outer">
|
||
<input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
|
||
</form>
|
||
<div id="searchresults-outer" class="searchresults-outer hidden">
|
||
<div id="searchresults-header" class="searchresults-header"></div>
|
||
<ul id="searchresults">
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
|
||
<script>
|
||
document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
|
||
document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
|
||
Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
|
||
link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
|
||
});
|
||
</script>
|
||
|
||
<div id="content" class="content">
|
||
<main>
|
||
<h1 id="learn-swift-grammar"><a class="header" href="#learn-swift-grammar">learn swift grammar</a></h1>
|
||
<h2 id="common"><a class="header" href="#common">common</a></h2>
|
||
<pre><code class="language-swift">import Foundation
|
||
typealias i8 = Int8
|
||
typealias i16 = Int16
|
||
typealias i32 = Int32
|
||
typealias i64 = Int64
|
||
typealias isize = Int
|
||
typealias u8 = UInt8
|
||
typealias u16 = UInt16
|
||
typealias u32 = UInt32
|
||
typealias u64 = UInt64
|
||
typealias usize = UInt
|
||
typealias f32 = Float
|
||
typealias f64 = Double
|
||
typealias char = Character
|
||
typealias string = String
|
||
typealias Option = Optional
|
||
typealias bool = Bool
|
||
typealias Codable = Decodable & Encodable
|
||
typealias Debug = CustomDebugStringConvertible
|
||
typealias VecDeque = BidirectionalCollection
|
||
typealias Vec = Collection
|
||
public enum Results<T> {
|
||
case OK(T)
|
||
case Err(T)
|
||
}
|
||
public enum Err: Error {
|
||
case notEqual(String)
|
||
}
|
||
func assertEqual<T:Equatable>(_ result1:T,_ result2:T)->Result<String,Error>{
|
||
if result1 == result2 {
|
||
return Result.success("expected \(result1) found \(result2)")
|
||
}else{
|
||
return Result.failure(Err.notEqual("expected \(result1) found \(result2)"))
|
||
}
|
||
}
|
||
func assertEq<T:Equatable>(_ result1:T,_ result2:T){
|
||
let result = assertEqual(result1,result2)
|
||
switch result {
|
||
case .success:
|
||
print("\(result)")
|
||
break
|
||
case .failure:
|
||
print("\(result)")
|
||
break
|
||
}
|
||
}
|
||
// assertEq(threeSum([-1, -1, -1, -1, 2, 1, -4, 0], target: 0),[[-1, -1, 2], [-1, 0, 1]])
|
||
</code></pre>
|
||
<h2 id="basic"><a class="header" href="#basic">basic</a></h2>
|
||
<pre><code class="language-swift">// Number
|
||
var int = 10
|
||
var float = 12.15
|
||
//Boolean
|
||
var have = true
|
||
var have_not = false
|
||
//print type of value
|
||
var numberOfPets = 4
|
||
print(type(of: numberOfPets))
|
||
var numberOfPetsDouble: Double = 4
|
||
print(type(of: numberOfPetsDouble))
|
||
var inchesDouble = 4.1243
|
||
print(type(of: inchesDouble))
|
||
var inchesFloat: Float = 4.1243
|
||
print(type(of: inchesFloat))
|
||
// String
|
||
var hstr = "hello world "
|
||
hstr.append("to the world")// push
|
||
//convert number to string by radix
|
||
let s0 = String(1635999) // returns "1635999"
|
||
let s1 = String(1635999, radix: 10) // returns "1635999"
|
||
let s2 = String(1635999, radix: 2) // returns "110001111011010011111"
|
||
let s3 = String(1635999, radix: 16) // returns "18f69f"
|
||
let s4 = String(1635999, radix: 16, uppercase: true) // returns "18F69F"
|
||
let s5 = String(1635999, radix: 17) // returns "129gf4"
|
||
let s6 = String(1635999, radix: 36) // returns "z2cf"
|
||
print("s3:\(s3)")
|
||
//String start_with,end_with
|
||
let is_start_with = "/demo".hasPrefix("/")
|
||
let is_end_with = "demo/".hasSuffix("/")
|
||
let long_string = """
|
||
is_start_with /:\(is_start_with)
|
||
is_end_with /:\(is_end_with)
|
||
"""
|
||
print(long_string)
|
||
//push string
|
||
var s7 = ""
|
||
s7.write("write") //like rusts push_str()
|
||
s7.append("append ") //like rusts push_str()
|
||
s7.append("🌍") //like rusts push() char
|
||
print("s7:\(s7)")
|
||
//slice string get prefix 前面的元素
|
||
var ss7 = s7.prefix(1)
|
||
print("ss7:\(ss7)")
|
||
//slice string get suffix 后面的元素
|
||
var ss8 = s7.suffix(1)
|
||
print("ss8:\(ss8)")
|
||
//split string
|
||
print("\(s7.split(separator: " "))") //["writeappend", "🌍"]
|
||
print("\(s7.split(separator: " ",maxSplits:0))") //["writeappend"]
|
||
print("\(s7.split(separator: " ",omittingEmptySubsequences:false))") //["writeappend", "🌍"] 不省略空
|
||
let s8 = "Hello!"
|
||
let bytes = s8.utf8CString
|
||
print(bytes)// Prints "[72, 101, 108, 108, 111, 33, 0]"
|
||
// reverse string
|
||
let w = "Backwards"
|
||
for char in w.reversed() {
|
||
print(char, terminator: "")
|
||
}
|
||
var ns1 = String("demo")
|
||
let numbers = 0...9
|
||
let shuffledNumbers = numbers.shuffled()
|
||
print("\(shuffledNumbers)")
|
||
//Array
|
||
var emptyAray = [String]()
|
||
var names = ["John", "Sansa", "Theon", "Jaime"]
|
||
names.insert("Varys", at: 2) //insert
|
||
names.append("Robb") //push back
|
||
names.remove(at: 3) //remove at index of 2
|
||
let words = ["apple", "orange", "banana"]
|
||
print("\(words.count)")
|
||
let new_names = ["Zoey", "Chloe", "Amani", "Amaia"]
|
||
let randomName = new_names.randomElement()!
|
||
let str = words.joined(separator:" : ")//json array to string
|
||
//Dictionaries
|
||
var emptyDict = [Int:Double]()
|
||
var capitalCities = ["Russia":"Moscow",
|
||
"Canada": "Ottawa", "France": "Paris"]
|
||
capitalCities["Germany"] = "Berlin"
|
||
capitalCities["Canada"] = "Toronto"
|
||
print(capitalCities)
|
||
for city in capitalCities{
|
||
print("The capital city of \(city.key) is \(city.value).")
|
||
}
|
||
//if else
|
||
var n = 10;
|
||
if n<9{
|
||
print(n);
|
||
}
|
||
else if n==10{
|
||
print("is \(10)");
|
||
}
|
||
else {
|
||
}
|
||
//simplified ifelse statement
|
||
let age = 25
|
||
let haveCar = age>28 ? true:false
|
||
print("have \(haveCar)")
|
||
//swich
|
||
var country = "Sweden"
|
||
switch country {
|
||
case "Germany":
|
||
print("This country is in Europe")
|
||
case "Sweden":
|
||
print("This country is in Europe")
|
||
case "USA":
|
||
print("This country is in North America")
|
||
case "India":
|
||
print("This country is in Asia")
|
||
case "Egypt":
|
||
print("This country is in Africa")
|
||
default:
|
||
print("Sorry i don't know the continent of this country")
|
||
}
|
||
let testscore = 80
|
||
var grade:Character
|
||
switch testscore {
|
||
case 90...100:
|
||
grade = "优"
|
||
case 80..<90:
|
||
grade = "良"
|
||
case 60..<80:
|
||
grade = "中"
|
||
case 0..<60:
|
||
grade = "差"
|
||
default:
|
||
grade = "无"
|
||
}
|
||
print("Grade = \(grade)")
|
||
// Loop
|
||
//for in loop
|
||
let listOfNames = ["John", "Sansa", "Theon","Jaime", "Robb", "Thyrion"]
|
||
for name in listOfNames {
|
||
print("listOfNames:\(name)")
|
||
}
|
||
//while loop
|
||
var startValue = 1
|
||
let endValue = 10
|
||
while startValue <= endValue {
|
||
print("startValue \(startValue)")
|
||
startValue += 1
|
||
}
|
||
//repeat-while-loop
|
||
var m = 2
|
||
repeat{
|
||
m*=2
|
||
}while m<10
|
||
print("m is: \(m)")
|
||
//Function
|
||
func ourFirstFunction() {
|
||
print("I love Swift!")
|
||
}
|
||
ourFirstFunction()
|
||
func sayHi(from name:String){
|
||
print("Hi \(name)")
|
||
}
|
||
func sayHi1(name:String){
|
||
print("Hi \(name)")
|
||
}
|
||
sayHi(from:"Andrew")
|
||
sayHi1(name:"Andrew")
|
||
func doubleTheInput(inputValue: Int) -> Int {
|
||
return inputValue*2
|
||
}
|
||
print("Double the input:\(doubleTheInput(inputValue:5))")
|
||
// Classes
|
||
class Car {
|
||
let horsepower = 100
|
||
let color = "red"
|
||
var numberOfCarDoors = 4
|
||
}
|
||
let myCar = Car()
|
||
// myCar.colour = "blue" //will error because let means that is constant value
|
||
myCar.numberOfCarDoors = 6
|
||
print("my car numberOfCarDoors :\(myCar.numberOfCarDoors)")
|
||
class NewCar {
|
||
let horsepower:Int
|
||
let color:String
|
||
let numberOfCarDoors:Int
|
||
init(horsepower: Int, color: String,numberOfCarDoors: Int) {
|
||
self.horsepower = horsepower
|
||
self.color = color
|
||
self.numberOfCarDoors = numberOfCarDoors
|
||
}
|
||
func engineOn() {
|
||
print("Engined turned on.")
|
||
}
|
||
func engineOff() {
|
||
print("Engine turned off.")
|
||
}
|
||
}
|
||
let myNewCar = NewCar(horsepower: 120, color:"green", numberOfCarDoors: 4)
|
||
print("my new car horsepower:\(myNewCar.horsepower)")
|
||
myNewCar.engineOn()
|
||
myNewCar.engineOff()
|
||
//Class Inheritance (对象继承)
|
||
class Person {
|
||
var firstName: String
|
||
var lastName: String
|
||
init(firstName: String, lastName: String){
|
||
self.firstName = firstName
|
||
self.lastName = lastName
|
||
}
|
||
func greetings() {
|
||
print("Hi, my name is \(firstName) \(lastName)!")
|
||
}
|
||
}
|
||
//Employee 继承Person class
|
||
class Employee: Person {
|
||
var staffNummer: Int
|
||
init(staffNummer: Int, firstName: String,lastName: String) {
|
||
self.staffNummer = staffNummer
|
||
super.init(firstName: firstName,lastName: lastName)//继承必须使用super.init()类初始化父类
|
||
}
|
||
func identity() {
|
||
print("First name \(firstName), Lastname \(lastName), Staff Number \(staffNummer)")
|
||
}
|
||
}
|
||
let christine = Employee(staffNummer: 780,firstName: "Christine", lastName: "Mayer")
|
||
christine.greetings() //调用父类的方法
|
||
christine.identity() //调用自己的方法
|
||
//Class overriding 重载 (替换父类的方法)
|
||
class Student:Person {
|
||
var stuId:String
|
||
init(stuId:String,firstName:String,lastName:String) {
|
||
self.stuId = stuId
|
||
super.init(firstName:firstName,lastName:lastName)
|
||
}
|
||
func sayStuId(){
|
||
print(stuId)
|
||
}
|
||
// overriding greetings
|
||
override func greetings() {
|
||
print("Hello, how are you?") //We override the function of the superclass
|
||
}
|
||
}
|
||
let ryan = Student(stuId:"1820012",firstName:"Andrew",lastName:"Ryan")
|
||
ryan.sayStuId()
|
||
ryan.greetings()
|
||
//Optionals 跟Rust的Option 一样
|
||
var ourFirstOptional: Int?
|
||
ourFirstOptional = 4
|
||
if let insideValue = ourFirstOptional { //just like rusts if let statement
|
||
print(insideValue)
|
||
} else {
|
||
print("Optional contains nil")
|
||
}
|
||
var studentOptional:Student?;
|
||
studentOptional?.sayStuId() //Nothing will happen
|
||
studentOptional?.greetings()//Nothing will happen
|
||
studentOptional = Student(stuId:"1820012",firstName:"Andrew",lastName:"Ryan")
|
||
studentOptional?.sayStuId() //will print id
|
||
//implment stack
|
||
struct Stack<T> : ExpressibleByArrayLiteral, CustomDebugStringConvertible {
|
||
var debugDescription: String {
|
||
get {
|
||
return "Stack: \(storage)"
|
||
}
|
||
}
|
||
typealias Element = T
|
||
private var storage: [T] = []
|
||
public init(arrayLiteral elements:Element...) {
|
||
self.storage = elements
|
||
}
|
||
mutating func push(_ item:T) {
|
||
storage.insert(item, at: 0)
|
||
}
|
||
mutating func pop() -> T? {
|
||
guard storage.count > 0 else { return nil }
|
||
return storage.remove(at: 0)
|
||
}
|
||
}
|
||
//栈 先进后出
|
||
var stack = Stack<i8>()
|
||
for i in 0...5{
|
||
stack.push(i8(i))
|
||
}
|
||
print("pop from stack:\(stack.pop()!)")
|
||
print("\(stack)")
|
||
learnArgument()
|
||
learnInput()
|
||
learnDir()
|
||
learnJSON()
|
||
learnTime()
|
||
learnSets()
|
||
learnResult()
|
||
</code></pre>
|
||
<h2 id="learnargument"><a class="header" href="#learnargument">learnArgument</a></h2>
|
||
<pre><code class="language-swift">import Foundation
|
||
// get arguments
|
||
func learnArgument(){
|
||
let args = CommandLine.arguments
|
||
if args.count != 2 {
|
||
print("Usage: cmd")
|
||
} else {
|
||
let name = args[1]
|
||
print("Name: \(name)")
|
||
}
|
||
}
|
||
</code></pre>
|
||
<h2 id="learninput"><a class="header" href="#learninput">learnInput</a></h2>
|
||
<pre><code class="language-swift">import Foundation
|
||
/// Inputs
|
||
var cin: String {
|
||
readLine()!
|
||
}
|
||
var cinArray: [Character] {
|
||
Array(cin)
|
||
}
|
||
extension String {
|
||
func str2(separator: Character = " ") -> (String, String) {
|
||
let a = split(separator: separator).map { String($0) }
|
||
precondition(a.count == 2)
|
||
return (a[0], a[1])
|
||
}
|
||
func strs(separator: Character = " ") -> [String] {
|
||
split(separator: separator).map { String($0) }
|
||
}
|
||
func int() -> Int {
|
||
guard let v = Int(self) else {
|
||
fatalError()
|
||
}
|
||
return v
|
||
}
|
||
func int2(separator: Character = " ") -> (Int, Int) {
|
||
let a = split(separator: separator).map { Int($0)! }
|
||
precondition(a.count == 2)
|
||
return (a[0], a[1])
|
||
}
|
||
func int3(offset: Int = 0, separator: Character = " ") -> (Int, Int, Int) {
|
||
let a = split(separator: separator).map { Int($0)! + offset }
|
||
precondition(a.count == 3)
|
||
return (a[0], a[1], a[2])
|
||
}
|
||
func int4(separator: Character = " ") -> (Int, Int, Int, Int) {
|
||
let a = split(separator: separator).map { Int($0)! }
|
||
precondition(a.count == 4)
|
||
return (a[0], a[1], a[2], a[3])
|
||
}
|
||
func int5(separator: Character = " ") -> (Int, Int, Int, Int, Int) {
|
||
let a = split(separator: separator).map { Int($0)! }
|
||
precondition(a.count == 5)
|
||
return (a[0], a[1], a[2], a[3], a[4])
|
||
}
|
||
func int6(separator: Character = " ") -> (Int, Int, Int, Int, Int, Int) {
|
||
let a = split(separator: separator).map { Int($0)! }
|
||
precondition(a.count == 6)
|
||
return (a[0], a[1], a[2], a[3], a[4], a[5])
|
||
}
|
||
func ints(separator: Character = " ") -> [Int] {
|
||
split(separator: separator).map { Int($0)! }
|
||
}
|
||
func float() -> Float {
|
||
guard let v = Float(self) else {
|
||
fatalError()
|
||
}
|
||
return v
|
||
}
|
||
func float2(separator: Character = " ") -> (Float, Float) {
|
||
let a = split(separator: separator).map { Float($0)! }
|
||
precondition(a.count == 2)
|
||
return (a[0], a[1])
|
||
}
|
||
func float3(separator: Character = " ") -> (Float, Float, Float) {
|
||
let a = split(separator: separator).map { Float($0)! }
|
||
precondition(a.count == 3)
|
||
return (a[0], a[1], a[2])
|
||
}
|
||
func float4(separator: Character = " ") -> (Float, Float, Float, Float) {
|
||
let a = split(separator: separator).map { Float($0)! }
|
||
precondition(a.count == 4)
|
||
return (a[0], a[1], a[2], a[3])
|
||
}
|
||
func floats(separator: Character = " ") -> [Float] {
|
||
split(separator: separator).map { Float($0)! }
|
||
}
|
||
func double() -> Double {
|
||
guard let v = Double(self) else {
|
||
fatalError()
|
||
}
|
||
return v
|
||
}
|
||
func double2(separator: Character = " ") -> (Double, Double) {
|
||
let a = split(separator: separator).map { Double($0)! }
|
||
precondition(a.count == 2)
|
||
return (a[0], a[1])
|
||
}
|
||
func double3(separator: Character = " ") -> (Double, Double, Double) {
|
||
let a = split(separator: separator).map { Double($0)! }
|
||
precondition(a.count == 3)
|
||
return (a[0], a[1], a[2])
|
||
}
|
||
func double4(separator: Character = " ") -> (Double, Double, Double, Double) {
|
||
let a = split(separator: separator).map { Double($0)! }
|
||
precondition(a.count == 4)
|
||
return (a[0], a[1], a[2], a[3])
|
||
}
|
||
func doubles(separator: Character = " ") -> [Double] {
|
||
split(separator: separator).map { Double($0)! }
|
||
}
|
||
}
|
||
func learnInput(){
|
||
let in_string = cin
|
||
let in_string_arr = in_string.strs(separator:" ")
|
||
print("in_string_arr: \(in_string_arr)")
|
||
}
|
||
</code></pre>
|
||
<h2 id="learndir"><a class="header" href="#learndir">learnDir()</a></h2>
|
||
<pre><code class="language-swift">import Foundation
|
||
func learnDir(){
|
||
let homeDir = NSHomeDirectory()
|
||
let userName = NSUserName()
|
||
if let home_user = NSHomeDirectoryForUser("andrew"){
|
||
print("\(homeDir),\(userName),\(home_user)")
|
||
}
|
||
let pwd = URL(fileURLWithPath: "./")
|
||
print("\(pwd)")
|
||
}
|
||
</code></pre>
|
||
<h2 id="learnjson"><a class="header" href="#learnjson">learnJSON</a></h2>
|
||
<pre><code class="language-swift">import Foundation
|
||
struct Employeer: Codable {
|
||
var name:String
|
||
var id: Int
|
||
var mToy:Toy
|
||
}
|
||
struct Toy:Codable {
|
||
var name:String
|
||
}
|
||
extension Employeer:Debug {
|
||
var debugDescription: String {
|
||
return name + "(" + String(id) + "): " + mToy.name
|
||
}
|
||
}
|
||
func learnJSON(){
|
||
/// encode instance to jsonString
|
||
let toyA = Toy(name: "Teddy Bear")
|
||
let employeeA = Employeer(name: "EmployA", id:1, mToy:toyA)
|
||
let jsonEncoder = JSONEncoder()
|
||
let jsonData = try? jsonEncoder.encode(employeeA)
|
||
// jsonData contains an unreadable representation of employeeA
|
||
print("jsonData: \(String(describing:jsonData))")
|
||
let jsonString = String(data: jsonData!, encoding: .utf8)
|
||
print("jsonString: \(String(describing:jsonString))")
|
||
/// decode jsonString to instance
|
||
let jsonDecoder = JSONDecoder()
|
||
let employeeADecoded = try? jsonDecoder.decode(Employeer.self, from: jsonData!)
|
||
print(employeeADecoded!)//result
|
||
/*
|
||
jsonData: Optional(54 bytes)
|
||
jsonString: Optional("{\"name\":\"EmployA\",\"id\":1,\"mToy\":{\"name\":\"Teddy Bear\"}}")
|
||
EmployA(1): Teddy Bear
|
||
*/
|
||
}
|
||
</code></pre>
|
||
<h2 id="learntime"><a class="header" href="#learntime">learnTime</a></h2>
|
||
<pre><code class="language-swift">import Foundation
|
||
extension Date {
|
||
/// 获取当前 秒级 时间戳 - 10位
|
||
var timeStamp : String {
|
||
let timeInterval: TimeInterval = self.timeIntervalSince1970
|
||
let timeStamp = Int(timeInterval)
|
||
return "\(timeStamp)"
|
||
}
|
||
/// 获取当前 毫秒级 时间戳 - 13位
|
||
var milliStamp : String {
|
||
let timeInterval: TimeInterval = self.timeIntervalSince1970
|
||
let millisecond = CLongLong(round(timeInterval*1000))
|
||
return "\(millisecond)"
|
||
}
|
||
}
|
||
func learnTime(){
|
||
//当前时间
|
||
let dformatter = DateFormatter()
|
||
dformatter.dateFormat = "yyyy年MM月dd日 HH:mm:ss"
|
||
print("当前日期时间:\(dformatter.string(from: Date()))")
|
||
//TimeStamp 时间戳
|
||
let millisecond = Date().milliStamp
|
||
print("当前毫秒级时间戳是 millisecond == ",millisecond)
|
||
let timeStamp = Date().timeStamp
|
||
print("当前秒级时间戳是 timeStamp == ",timeStamp)
|
||
//将时间戳转为日期时间
|
||
let timeStamp1 = 1463637809
|
||
print("时间戳:\(timeStamp1)")
|
||
let timeInterval:TimeInterval = TimeInterval(timeStamp1)
|
||
let date = Date(timeIntervalSince1970: timeInterval)//转换为时间
|
||
let dformatter1 = DateFormatter()
|
||
dformatter1.dateFormat = "yyyy年MM月dd日 HH:mm:ss"
|
||
print("对应的日期时间:\(dformatter1.string(from: date))")//格式话输出
|
||
//获取当前时区
|
||
let zone = NSTimeZone.system
|
||
print("zone = \(zone)")
|
||
//获取当前时区和GMT的时间间隔
|
||
let interval = zone.secondsFromGMT()
|
||
print("interval = \(interval)")// 当前时区和格林威治时区的时间差 8小时 = 28800秒
|
||
print("interval = \(interval/3600)")// 输出当前系统时区
|
||
//获取当前系统时间
|
||
let now = Date().addingTimeInterval(TimeInterval(interval))
|
||
print("now time = \(now)")// 是Date格式不是String
|
||
}
|
||
/**
|
||
输出结果
|
||
当前日期时间:2022年12月21日 00:42:10
|
||
当前毫秒级时间戳是 millisecond == 1671554530990
|
||
当前秒级时间戳是 timeStamp == 1671554530
|
||
时间戳:1463637809
|
||
对应的日期时间:2016年05月19日 14:03:29
|
||
*/
|
||
</code></pre>
|
||
<h2 id="learnsets"><a class="header" href="#learnsets">learnSets</a></h2>
|
||
<pre><code class="language-swift">import Foundation
|
||
func learnSets(){
|
||
var primes: Set = [2, 3, 5, 7,55]
|
||
if primes.isEmpty {
|
||
print("No primes!")
|
||
} else {
|
||
primes.insert(77)
|
||
print("We have \(primes.count) primes.")
|
||
}
|
||
let primesSum = primes.reduce(0, +)
|
||
let primeStrings = primes.sorted().map(String.init)
|
||
print("primesSum:\(primesSum)")
|
||
print("primeStrings:\(primeStrings)")
|
||
primes.remove(77)
|
||
primes.removeFirst()
|
||
if let index = primes.firstIndex(of:55){
|
||
primes.remove(at:index)
|
||
}
|
||
let smallNums = primes.filter { $0 < 5 }
|
||
print("smallNums:\(smallNums)")
|
||
// Tests whether primes is a subset of a Range<Int>
|
||
print(primes.isSubset(of: 0..<10))
|
||
// Prints "true"
|
||
// Performs an intersection with an Array<Int>
|
||
let favoriteNumbers = [5, 7, 15, 21]
|
||
print(primes.intersection(favoriteNumbers)) //集合的交集
|
||
}
|
||
</code></pre>
|
||
<h2 id="learnresult"><a class="header" href="#learnresult">learnResult</a></h2>
|
||
<pre><code class="language-swift">func getResult()->Results<String> {
|
||
Results.OK("ok")
|
||
}
|
||
func learnResult(){
|
||
print("\(getResult())")
|
||
}
|
||
</code></pre>
|
||
<h2 id="impliment-like-pythons-system-function-with-swift"><a class="header" href="#impliment-like-pythons-system-function-with-swift">impliment like pythons system function with swift</a></h2>
|
||
<pre><code class="language-swift">//python's os.system()
|
||
import Foundation
|
||
#if os(Linux)
|
||
func system(_ command: String) -> Void {
|
||
let task = Process()
|
||
task.executableURL = URL(fileURLWithPath: "/bin/sh")
|
||
task.arguments = ["-c", command]
|
||
do {
|
||
try task.run()
|
||
task.waitUntilExit()
|
||
} catch {
|
||
print("Error: \(error.localizedDescription)")
|
||
}
|
||
}
|
||
system("ls")
|
||
#elseif os(macOS)
|
||
func system(_ command: String) -> Void {
|
||
let task = Process()
|
||
task.executableURL = URL(fileURLWithPath: "/bin/sh")
|
||
task.arguments = ["-c", command]
|
||
do {
|
||
try task.run()
|
||
task.waitUntilExit()
|
||
} catch {
|
||
print("Error: \(error.localizedDescription)")
|
||
}
|
||
}
|
||
system("ls")
|
||
#elseif os(Windows)
|
||
func system_cmd(_ command: String) -> Void {
|
||
let task = Process()
|
||
task.executableURL = URL(fileURLWithPath: "cmd")
|
||
task.arguments = ["/c", command]
|
||
do {
|
||
try task.run()
|
||
task.waitUntilExit()
|
||
} catch {
|
||
print("Error: \(error.localizedDescription)")
|
||
}
|
||
}
|
||
system_cmd("ping dnrops.gitee.io")
|
||
func system_powershell(_ command: String) -> Void {
|
||
let task = Process()
|
||
task.executableURL = URL(fileURLWithPath: "powershell")
|
||
task.arguments = ["-Command", command]
|
||
do {
|
||
try task.run()
|
||
task.waitUntilExit()
|
||
} catch {
|
||
print("Error: \(error.localizedDescription)")
|
||
}
|
||
}
|
||
system_powershell("ping dnrops.gitee.io")
|
||
#else
|
||
let platform = "Unknown"
|
||
print("This operating system is not supported.")
|
||
#endif
|
||
</code></pre>
|
||
|
||
</main>
|
||
|
||
<nav class="nav-wrapper" aria-label="Page navigation">
|
||
<!-- Mobile navigation buttons -->
|
||
<a rel="prev" href="../../posts/swift/swift.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||
<i class="fa fa-angle-left"></i>
|
||
</a>
|
||
|
||
<a rel="next prefetch" href="../../posts/swift/swift_extensions.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||
<i class="fa fa-angle-right"></i>
|
||
</a>
|
||
|
||
<div style="clear: both"></div>
|
||
</nav>
|
||
</div>
|
||
</div>
|
||
|
||
<nav class="nav-wide-wrapper" aria-label="Page navigation">
|
||
<a rel="prev" href="../../posts/swift/swift.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||
<i class="fa fa-angle-left"></i>
|
||
</a>
|
||
|
||
<a rel="next prefetch" href="../../posts/swift/swift_extensions.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||
<i class="fa fa-angle-right"></i>
|
||
</a>
|
||
</nav>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
<script>
|
||
window.playground_line_numbers = true;
|
||
</script>
|
||
|
||
<script>
|
||
window.playground_copyable = true;
|
||
</script>
|
||
|
||
<script src="../../ace.js"></script>
|
||
<script src="../../editor.js"></script>
|
||
<script src="../../mode-rust.js"></script>
|
||
<script src="../../theme-dawn.js"></script>
|
||
<script src="../../theme-tomorrow_night.js"></script>
|
||
|
||
<script src="../../elasticlunr.min.js"></script>
|
||
<script src="../../mark.min.js"></script>
|
||
<script src="../../searcher.js"></script>
|
||
|
||
<script src="../../clipboard.min.js"></script>
|
||
<script src="../../highlight.js"></script>
|
||
<script src="../../book.js"></script>
|
||
|
||
<!-- Custom JS scripts -->
|
||
<script src="../../src/js/custom.js"></script>
|
||
|
||
|
||
</div>
|
||
</body>
|
||
</html>
|