LoginSignup
2
7

More than 3 years have passed since last update.

[Swift5]paizaでよく使う文法メモ(初心者向け)

Last updated at Posted at 2020-07-03

背景

普段Swift使ってアプリを開発していますが、
「paizaをSランクにしておくといいかも」との助言もあり、ついこの間paizaをやりはじめてみました。

普段使わない文法で慣れていなかったり、そもそもコードのバージョンが古いサイトもあったので、自分用に「paizaでよく使う文法」をまとめました。
参考にどうぞ。

よく使うコード

標準入力

//1行取得 例:1
let input_line = readLine()!

//複数行 
let input_line1 = readLine()!
let input_line2 = readLine()!
let input_line3 = readLine()!

//複数行
var strs = [String]()
for _ in 0..<8 {
   strs.append(readLine()!)
}

//複数行
while let line = readLine() {
    // 入力された行に対する処理
}

※7/4追記
コメント欄で以下の方法を教えていただきました。ありがとうございます。

//複数行取得
let s = AnyIterator { readLine() }.joined()

//配列で取得(くそ便利)
let arr = Array(AnyIterator { readLine() })

文字列の処理

//例: 1 3 5 7 → ["1","3","5","7"]
let strs = input_line.split(separator:" ")

//例: 16357 → ["1","6","3","5","7"]
let strs = input_line.map{String($0)}

//例: ["1","3","5","7"] → [1,3,5,7]
let numbers = strs.map({Int($0)!})

補足:「標準入力〜文字列の処理」をこんな関数にしてやると便利かも

func readInts() -> [Int] {
    return readLine()!.split(separator: " ").map { Int($0)! }
}

さて、続き。

let s = "ぎょうざたべたい"
//前から◯文字取得
s.prefix(3) //ぎょう

//後ろから◯文字取得
s.suffix(2) //たい

//◯文字切り捨て
s.dropLast(2) //ぎょうざたべ

//文字列切り出し m文字目〜n文字目
let i1 = s.index(s.startIndex, offsetBy: 3)
let i2 = s.index(s.startIndex, offsetBy: 6)

s[i1...i2] //ざたべた
s[i1..<i2] //ざたべ
//文字列結合
let s1 = "はら"
let s2 = "へった"
s1 + s2 //はらへった

let array = ["はら","へった"]
array.joined() //はらへった
array.joined(separator:" ") //はら へった
array.joined(separator:",") //はら,へった
//文字列に文字が含まれるか
let s = "はろーSwift"
if s.contains("は"){
  print("OK")
}
//文字列の一部を置き換え
var s = "はじめましてこんにちは"
if let range = s.range(of:"こんにちは"){
  s.replaceSubrange(range, with: "さようなら") //はじめましてさようなら
}
//大文字・小文字
let a = "swift".uppercased()
let b = "SWIFT".lowercased()
//ある文字列をn個繰り返す
let s = String(repeating: "AB", count: 5)
// "ABABABABAB"

配列初期化

var a = [String]()
var b = [[String]]()
b.append(["はじ","めまして"])

配列並び替え

var array = [5,2,6,7,1]
array.sort{$0 < $1} //昇順 [1,2,5,6,7]
array.sort{$0 > $1} //降順 [7,6,5,2,1]
array.reversed() //逆順 [1,7,6,2,5]

・sort()は配列を書き換える
・sorted()は配列を書き換えない

配列絞り込み

//例:3で割り切れるもののみからなる配列に
let array = [5,2,6,3,1]
array.filter({$0 % 3 == 0}) //[6,3]

配列結合

let arr1 = [5,2,6]
let arr2 = [3,1]
arr1 + arr2 //[5,2,6,3,1]

//配列に要素を追加
let arr = ["a", "b", "c", "e"]
arr.insert("d", at: 3) //["a", "b", "c", "d", "e"]

//配列末尾に要素を追加
arr.append("←") //["a", "b", "c", "e", "f"]

配列の要素の合計値

let array = [1, 2, 3, 4, 5]
let result = array.reduce(0) { $0 + $1 } //15

このコードだとreduce()の良さが出てない気もしますが。。。

配列の全要素が条件を満たすかどうか

//全ての要素が偶数かどうか
let values = [2, 4, 6, 8]

//contains()
let isAllEven = !values.contains { !($0 % 2 == 0) }

//allSatisfy()
let isAllEven = values.allSatisfy { $0 % 2 == 0 }

allSatisfy()の方が可読性が高いですね。Swift 4.2でSequenceに追加されたメソッドです。

配列のindexを取得

let scores = [8, 6, 1, 62 ,90]

//enumerated()
for (index, score) in scores.enumerated() {
    print("\(index): \(score)")
}

//index(of: )
if let index = scores.index(of: 90) {
    print("index: \(index)")
}

//index(where: )
if let index = scores.index(where: {$0 == 90}) {
    print("index: \(index)")
}

enumerated()ですが、インデックスと要素のタプルを返します。

配列をユニークに

let array = [3, 4, 2, 2, 1, 5, 1, 3, 4]
let result = array.reduce([], { $0.contains($1) ? $0 : $0 + [$1] })
// [1, 2, 3, 4, 5]

三項演算子を使って書いています。
[]に要素をわんこそばのように追加していくイメージです

絶対値

let a = abs(-6) //6

累乗

let a = pow(5.0, 3)

◯進数

let a = 44
let str2 = String(num, radix: 2)
let str16 = String(num, radix: 16)

//2進数を10進数に
let int = Int("110110", radix: 2)

最大、最小

max(1,5,2) //5
min(1,5,2) //2

let h = [65.7, 64.3, 61.1, 67.5, 58.5, 60.3, 64.9]
let max = h.max() //67.5
let min = h.min() //58.5

倍数

//2の倍数か?
let a = 18
a.isMultiple(of: 2) //true

小数点以下切り捨て・切り上げ・四捨五入

let a = 3.1
floor(a)   //切り捨て 3.0
ceil(a)    //切り上げ 4.0
round(a)   //四捨五入 3.0

//小数点をずらして整数値に
let b = a * 10
floor(b) / 10   //切り捨て 3
ceil(b) / 10    //切り上げ 4
round(b) / 10   //四捨五入 3

0埋めする format指定

let num1 = String(format: "%04d", 9) //0009
let num2 = String(format: "%0.3f", 0.2) // 0.200

終わりに

「他にもこれよく使うよ」という文法があったらコメントで教えてくれると喜びます(笑)

一緒にpaizaランクSを目指しましょう!

2
7
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
7