- 投稿日:2020-04-09T18:03:06+09:00
swiftの基礎的な書き方
Xcodeの基礎的なことを書いていきます。
変数と定数
変数は数学で習う、χみたいなもので数字を何回でも入れ替えることができる。
変数では、先頭にvarをつける。
var 変数名: 型名
定数は一度決めたら変えられないもの。
例えば円の直径を計算するときのπ=3.14みたいな、変えたらおかしくなってしまうもの。
定数は先頭にletをつける。
let 変数名: 型名
Swiftのデータ型
Swiftのデータ型を書いていきます。
Int型
正と負のデータを扱うときに使う。
Double型
小数点を扱うときに使う。
小数点を扱うものにFloat型もあるがこれは扱える範囲が狭いため基本的にはDouble型を使う。String型
文字列を扱うときに使う。
Bool型
論理演算でtrueかfalseを扱うときに使う。
条件分岐処理
条件分岐をするときは大体if文を使う。
こんな感じvar num = 10 if (num > 5) { print("true") } else { print("false") }結果は
trueとなるここにelse ifを使うことでどんどん条件を増やしていく。
文字列の結合
文字列の結合はこんな感じに書く
var test1 = tarou var test2 = maru print(test1 + test2) 結果 taroumaru文字と数字はそのままだと結合できないので、文字に合わせる場合は
String(test1)
というような感じで結合する。出力
swiftには
dump
という出力方法がある。
基本的に使うのはprintで、細かななところまで出力できるのがdumpdeです。
- 投稿日:2020-04-09T00:29:16+09:00
Leetcode 30 天挑戰, Week 2 Day 1, Middle of the Linked List, in Swift
資料結構或演算法:
Linked List
Slow Fast Pointer
因為想要紀錄自己思考解法的過程記錄下來,就寫了這篇。
相關連結
- 挑戰頁面: https://leetcode.com/explore/challenge/card/30-day-leetcoding-challenge/529/week-2/3290/
- 原題目 - 876. Middle of the Linked List
思考方式
因為 linked list 無法取得有幾個數,為了取得中間數,只能透過 slow fast pointer 來達成。這個方式也有人叫他「龜兔賽跑」。
而這題就是還滿典型和可以說是最簡化的 "slow fast pointer" 問題。
概要是 slow 一次移動一個位置(?),fast 一次移動兩個位置(?)。
當 fast 移動到尾端之後,slow pointer 停留的位置就自然就會是 linked list 中正中間的節點。判斷尾端
判斷是否移動到尾端,用了
fast != nil
和fast?.next != nil
的原因是,
- 有 奇 數個節點數的時候,需要用
fast?.next != nil
判斷- 有 偶 數個節點數的時候,則需要用
fast?.next != nil
判斷詳細說明和步驟附在最後面。
Code
class Solution { func middleNode(_ head: ListNode?) -> ListNode? { var slow: ListNode? = head var fast: ListNode? = head while fast != nil && fast?.next != nil { slow = slow?.next fast = fast?.next?.next } return slow } }複雜度分析
令 n 為 linked list 的長度
- 時間複雜度: O(n)
- 即使最多是執行 n/2 次,但是還是會寫成 O(n)
- 空間複雜度: O(1)
- 沒有用到和 list 長度有關個數的記憶體空間,所以這邊是常數
執行結果
尾端判斷說明
奇數個:
1 -> 2 -> 3 -------------- s f -------------- s 移動 1 個, f 移動 2 個 s f -------------- // 這時候 fast 已經抵達尾端,同時也可以發現 fast 沒有下一個節點。偶數個:
1 -> 2 -> 3 -> 4 -------------- s f -------------- s 移動 1 個, f 移動 2 個 s f -------------- s 移動 1 個, f 移動 2 個 s f -------------- // 這時候 fast 已經超過數列,可判定為到達尾端,同時也可以發現 fast 已經成為空值 (nil)以上, happy leetcoding !!
- 投稿日:2020-04-09T00:28:41+09:00
"001 UILabelで文字を表示" iOS app開発 習得日記 (5)
UIkitを覚えるために
こちらの写経がいいときいたので始めた
(http://docs.fabo.io/swift/uikit/001_uilabel.html)001 UILabelで文字を表示
import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. let bWidth: CGFloat = 200 let bHeight: CGFloat = 50 let posX: CGFloat = self.view.bounds.width/2 - bWidth/2 let posY: CGFloat = self.view.bounds.height/2 - bHeight/2 let label: UILabel = UILabel(frame: CGRect(x: posX, y: posY, width: bWidth, height: bHeight)) label.backgroundColor = UIColor.orange label.layer.masksToBounds = true label.layer.cornerRadius = 20.0 label.shadowColor = UIColor.gray label.textAlignment = NSTextAlignment.center self.view.backgroundColor = UIColor.cyan self.view.addSubview(label) } }selfは、ViewControllerのインスタンスを表しているのでよいのか?
また、label.layer.masksToBoundsとドットを続けて書いているところがわからない。
labelインスタンスの layerプロパティのmasksToboundsプロパティということ?
プロパティのプロパティ?
どういうこと?
- 投稿日:2020-04-09T00:11:27+09:00
SwiftとC#の書き方比較
はじめに
C#を書くにあたり、「Swiftでいうと・・・これ?
」「なんだ、これは?
」と
かなり困惑したので、比較表を作ろうと思いました。
私自身、初心者なので同じ初心者の方々のお役に立てれば嬉しいです
記事の内容に関して、勘違いもあると思いますし、これが全てではありません。
色々な記事を読んで、自らの手をどんどん動かしてみてください!変数と定数
Swift//変数 var hoge: String = "Hello" //定数 let fuga: Int = 810C#//変数 string hoge = "Hello"; //定数 const int fuga = 810;
- ポイント
- Sfiftでは型名は後 / C#では型名は前
- C#では文末にセミコロンが必要(初めは忘れがちです
)
右辺の型が自明である場合はわざわざ型を記載しなくても良いですが、本文では記載しておきます。
型変換(StringとIntで)
Swift//String → Int var hoge: String = "114" var fuga: Int = Int(hoge)! //Int → String var hoge: Int = 514 var fuga: String = String(hoge)C#//String → Int string hoge = "114"; int? fuga = int.Parse(hoge); //Int → String int hoge = 514; string fuga = hoge.ToString();
- ポイント
- Swiftは 型(値)
- C#はメソッドを使う(変換する型の組み合わせによっては他のやり方もある)
配列
Swift//配列の作成 var someInts: [Int] = [] //要素の追加 someInts.append(1) someInts += [2,3,4,5] print(someInts) //[1,2,3,4,5]C#//要素数が可変なリストの作成 List<int> someInts = new List<int>(); //要素の追加 someInts.add(1); //これがC#の配列宣言 int[] addInts = new int[] {2,3,4,5}; someInts.AddRange(addInts); Console.WriteLine(someInts); //[1,2,3,4,5]
- ポイント
- Swiftの配列は要素数が可変
- C#の配列は要素数が固定(Listは可変)
for文
Swift//昇順処理なのでC#みたいに色々と書かなくてもよい for i in 1...5 { print(i) //1,2,3,4,5 }C#//カッコ内で色々と書く //iの開始値は1,iは5まで繰り返す,iはfor文の処理を終えるごとに+1する for(int i = 1; i <= 5; i++) { Console.WriteLine(i); //1,2,3,4,5 }
- ポイント
- Swiftのfor-in文は昇順処理をしてくれるため、簡潔に記載できる(Swift3.x~)
- C#はforのカッコ内で色々と書く必要がある
map,foreachなど色々ありますが、今回は最も基本的なもので比較しています。
if文
Swiftvar num: Int = 5 //カッコなしで書ける if num == 5 { print("5だよ") } else { print("5じゃないよ") } // 5だよC#int num = 5; //カッコがいる if(num == 3) { Console.WriteLine("3だよ"); } else { Console.WriteLine("3じゃないよ"); } //3じゃないよ
- ポイント
- 書き方はそんなに違いなし!?
関数
Swift//func 関数名(ラベル 引数名: 型) -> 戻り値の型 func plusWithNum(_ num1: Int, _ num2: Int) -> Int{ return num1 + num2 } //ラベルにアンスコを書くことでラベルなしで呼べる plusWithNum(1,5) //6 //ちょっと余談 //func 関数名(ラベル省略 引数名: 型) -> 戻り値の型 func plusWithNum(num1: Int, num2: Int) -> Int{ return num1 + num2 } //引数名がラベルになるが、呼び出すときに記述する必要あり plusWithNum(num1: 1, num2: 5) //6C#//戻り値の型 関数名(型 引数名) int plusWithNum(int num1, int num2) { return num1 + num2; } //普通に引数の型と同じものを入れたらよい plusWithNum(1,5) //6 //追記 // 名前付き引数での呼び出し PlusWithNum(num1: 1, num2: 5); // 名前付き引数の場合, 順番を前後させても問題ない PlusWithNum(num2: 5, num1: 1);
- ポイント
- Swiftは「->」の後が戻り値の型で関数を使用するときに引数にはラベルが必要
- C#は関数名の前が戻り値の型で素直に引数を入れたらよい
C#もSwiftのように引数名を書いて呼び出せるようです(@Midoliy さん、ありがとうございます!)
さいごに
ざっくりと基本文法の比較を書いてみました。
これはほんの一部に過ぎません(氷山の一角ですらない)
どんどん検索をして知識を深めていきましょう(私も頑張ります)
この記事が最初の1歩を踏み出す助けになれたら幸いです。
今後はSwiftのことを中心に記事を書いていこうと思うので、よろしくお願いします参考サイト