メモ > 技術 > プログラミング言語: Swift > 基本の文法
基本の文法
※基本的にPlaygroundsで試したもの。
■コメント
// これは一行のコメントです
/*
* これは複数行のコメントです
*/
■デバッグ
// デバッグ用の出力
print("TEST")
let greeting1 = "おはよう"
let greeting2 = "こんにちは"
let greeting3 = "こんばんは"
// デバッグ用の出力
print(greeting1, greeting2, greeting3, separator: "/")
■ステートメント
// 命令文の区切りは改行もしくはセミコロン
let number1 = 1 + 2 + 3
print(number1)
// 改行やスペースは原則無視される
let number2
= 1
+ 2
+ 3
print(number2)
■特殊なキーワード
print("現在のファイル名: ", #file)
print("現在の行数: ", #line)
print("現在のカラム数: ", #column)
print("現在のメソッド・関数名: ", #function)
■変数
// 定数を宣言
let name1: String
let width1: Int, height1: Int
name1 = "山田"
width1 = 56
height1 = 75
// 定数を宣言(型推論)
let name2 = "山田"
let width2 = 56, height2 = 75
// 変数を宣言
var name3: String
var width3: Int, height3: Int
name3 = "山田"
width3 = 56
height3 = 75
// 変数を宣言(型推論)
var name4 = "山田"
var width4 = 56, height4 = 75
■タプル
// タプルを宣言
let product: (String, Int)
product = ("Swift", 2014)
// タプル(型推論)
let guest = ("山田", "やまだ", 18)
// タプル(値の取得)
print(guest.0, guest.1)
let (guest_name, _, guest_age) = guest
print(guest_name, guest_age)
// タプル(ラベル)
let book = (name: "Xcode", price: 2200)
print(book.name, book.price)
■演算
// 演算子
let a = 1 + 3 * 2
let b = 10 / (4 - 2)
let c = 10 % 3
print(a, b, c)
// 三項演算子
let bigger = a > b ? a : b
print(bigger)
// 型変換
let price = 2200
let tax = 0.08
let total = Double(price) + Double(price) * tax
■条件分岐
if a >= 10 {
print("aは10以上です")
} else if a >= 5 {
print("aは9より小さく5以上です")
} else {
print("aは5より小さいです")
}
if a >= 5, b >= 5 {
print("aとbは5以上です")
}
switch a {
case (10 ... 20):
print("aは10以上20以下です")
case (0 ... 9):
print("aは0以上9以下です")
default:
print("条件に一致しません")
}
■繰り返し
for num in 5...9 {
print(num)
}
for num in stride(from: 10, to: 30, by: 3) {
print(num)
}
var power = 0
while power < 10 {
power += 3
}
print(power)
repeat {
power += 3
print(power)
} while (power < 20)
■関数
// 戻り値のない関数
func hello() {
print("ハロー")
}
/*
// 戻り値が無いことを明示
func hello() -> Void {
print("ハロー")
}
*/
hello()
// 戻り値のある関数
func dice() -> Int {
let number = 1 + arc4random_uniform(6)
return Int(number)
}
print(dice())
// 引数のある関数
func price(price: Int, number: Int) -> Int {
let total = price * number
return total
}
print(price(price: 1200, number: 3))
// 引数を省略できる関数
func tax_included_price(price: Int, number: Int, tax: Double = 0.08) -> Int {
let total_price = price * number
let tax_price = Double(total) * tax
return total_price + Int(tax_price)
}
print(tax_included_price(price: 1200, number: 3))
// 引数の数を固定しない関数
func sum(numbers: Int...) -> Int {
var total = 0
for number in numbers {
total += number
}
return total
}
let number = sum(numbers: 2, 4, 6, 8)
print(number)
// 複数の戻り値がある関数(タプル)
func getResult(test1: Int, test2: Int, test3: Int) -> (total: Int, average: Double) {
let total = test1 + test2 + test3
let average = Double(total) / 3
return (total, average)
}
let result = getResult(test1: 10, test2: 20, test3: 30)
print(result.total, result.average)
// 関数の多重定義(オーバーロード)
func calc(a: Int, b: Int) -> Int {
return a + b
}
func calc(c: Int, d: Int) -> Int {
return a - b
}
func calc(a: Int, b: Int, c: Int) -> Int {
return (a + b) * c
}
func calc(a: Double, b: Double) -> Double {
return a / b
}
let ans1 = calc(a: 2, b: 3)
let ans2 = calc(c: 2, d: 3)
let ans3 = calc(a: 2, b: 3, c: 4)
let ans4 = calc(a: 2.0, b: 3.0)
print(ans1)
print(ans2)
print(ans3)
print(ans4)
// 外部引数名を付けた関数
func bmi(weight kg: Double, height cm: Double) -> Double {
if cm == 0 {
return -1
}
// 体重を身長の2乗で割る
var result = kg / pow(cm * 0.01, 2)
// 小数点以下1位で四捨五入する
result = round(result * 10) / 10.0
return result
}
let mybmi = bmi(weight: 56, height: 172.5)
print(mybmi)
// 引数名なしで値だけを指定できる関数
func triangleArea(_ width: Double, _ height: Double) -> Double {
let result = width * height / 2
return result
}
let area = triangleArea(30, 16.5)
■文字列
// 文字列
let message1 = "こんにちは"
let message2 = String("さようなら")
var message3: String
message3 = "こんばんは"
let message4 = """
こんにちは。
今日はいい天気ですね。
"""
print(message1.count)
print("挨拶「\(message1)」の文字数は「\(message1.count)」です。")
print(message1 + message2)
// 文字列と数値の変換
let convert1: String = "123"
let convert2: Int = 456
let convert3 = Int(convert1)! + convert2
print(convert3)
let convert4 = convert1 + String(convert2)
print(convert4)
// 文字列の比較
let string1 = "iOS16"
let string2 = "ios16"
if string1 == string2 {
print("string1とstring2は同じです。")
} else {
print("string1とstring2は同じではありません。")
}
if string1.lowercased() == string2.lowercased() {
print("string1とstring2は同じです。")
} else {
print("string1とstring2は同じではありません。")
}
// 文字列のパターンマッチ
let string3 = "iOS16"
if string3.hasPrefix("i") {
print("string1は「i」から始まります。")
}
if string3.hasSuffix("16") {
print("string1は「OS」で終わります。")
}
if string3.contains("OS") {
print("string1には「iOS」が含まれています。")
}
■配列
// 配列を宣言
var strArray1: [String] = []
var intArray1 = [Int]()
var doubleArray1 = Array<Double>()
strArray1 = ["a", "b", "c"]
intArray1 = [1, 2, 3]
doubleArray1 = [0.1, 0.2, 0.3]
// 配列を宣言(型推論)
var strArray2 = ["a", "b", "c"]
var intArray2 = [1, 2, 3]
var doubleArray2 = [0.1, 0.2, 0.3]
var boolArray2 = [true, false, true]
var tupleArray2 = [(1, 2), (10, 20), (100, 200), ]
// 配列の操作
var intArray = [Int]()
if intArray.isEmpty {
print("intArray3は空の配列です。")
}
intArray = [1, 2, 3]
print(intArray.count)
intArray = [Int](repeating: 0, count: 5)
print(intArray)
intArray = [Int](-3...5)
print(intArray)
intArray += [6, 7]
print(intArray)
// 配列からの取り出し
print(intArray[0])
print(intArray[1])
print(intArray[2...6])
print(intArray.first!)
print(intArray.last!)
print(intArray.firstIndex(of: 2)!)
// 配列への値追加と値削除
intArray.append(8)
intArray.append(contentsOf: [9, 10])
intArray.remove(at: 1)
print(intArray)
■辞書
// 辞書を宣言
var sizeTable = Dictionary<String, Int>()
var userDic = [String: String]()
var pointDic = [String: (Int, Int)]()
sizeTable = ["S": 47, "M": 52, "L": 55]
userDic = ["Taro": "B", "Hanako": "A", "Kenta": "B"]
pointDic = ["p1": (10,30), "p2": (30,50), "p3": (20,40)]
// 辞書を宣言(型推論)
let resultDic = ["A": true, "B": false, "C": true]
// 辞書の操作
var prefCode = ["東京都": 13, "大阪府": 27, "福岡県": 40]
if prefCode.isEmpty {
print("prefCodeは空です。")
} else {
let num = prefCode.count
print("prefCodeの要素は\(num)個です。")
}
prefCode.removeValue(forKey: "福岡県")
print(prefCode)
let data = (key: "大阪府", value: 27)
if prefCode.keys.contains(data.key) {
print("含まれています。")
} else {
print("含まれていません。")
}
// 辞書からの取り出し
print(String(prefCode["東京都"]!))
// 辞書への値追加と値削除
prefCode["北海道"] = 1
prefCode["青森県"] = 2
print(prefCode)
for code in prefCode {
print(code)
}
for code in prefCode.keys {
print(code)
}
for code in prefCode.values {
print(code)
}
prefCode.removeAll()
print(prefCode)
■セット
// セットの宣言
let aSet: Set<String> = ["リンゴ", "みかん", "桃", "イチゴ"]
let bSet: Set<String> = ["イチゴ", "スイカ", "みかん", "バナナ"]
// aSetとbSetの要素を合わせたセット
let cSet = aSet.union(bSet)
print(cSet)
// aSetとbSetの共通した要素のセット
let dSet = aSet.intersection(bSet)
print(dSet)
// aSetからbSetの要素を取り除いたセット
let eSet = aSet.subtracting(bSet)
print(eSet)
// aSetとbSetの一方のみに含まれている要素のセット
let fSet = aSet.symmetricDifference(bSet)
print(fSet)
// セットの比較
if aSet == bSet {
print("セットの持つ要素は同じです")
} else {
print("セットの持つ要素は同じではありません")
}
if aSet.isDisjoint(with: bSet) {
print("セットに共通した値はありません")
} else {
print("セットに共通した値はあります")
}
if aSet.isSubset(of: bSet) {
print("aSetはbSetに含まれています")
} else {
print("aSetはbSetに含まれていません")
}
if aSet.isSuperset(of: bSet) {
print("aSetはbSetを含んでいます")
} else {
print("aSetはbSetを含んでいません")
}
■オプショナル
let nums = [2, 4, 6]
let lastNum = nums.last
//let ans1 = lastNum * 2
let ansNum1 = lastNum! * 2
print(ansNum1)
let ansNum2 = lastNum ?? 0
print(ansNum2)
if let ansNum3 = lastNum {
print(ansNum3)
}
■クラス
// 基本的なクラス
class MyClass {
var msg = "Hello!"
func hello() {
print(msg)
}
}
let myObj = MyClass()
myObj.hello()
myObj.msg = "ハロー!"
myObj.hello()
// イニシャライザを使用したクラス
class MyClass2 {
let msg: String
init(msg: String = "Hello!") {
self.msg = msg
}
func hello() {
print(msg)
}
}
let myObj2 = MyClass2(msg: "こんにちは")
myObj2.hello()
// 複数のイニシャライザを使用したクラス
class MyClass3 {
let msg: String
let name: String?
init(msg: String = "Hello!") {
self.msg = msg
self.name = nil
}
init(msg: String = "Hello!", name: String = "Swift") {
self.msg = msg
self.name = name
}
func hello() {
if let name = self.name {
print(name + "さん、" + msg)
} else {
print(msg)
}
}
}
let myObj3 = MyClass3(msg: "こんにちは", name: "太郎")
myObj3.hello()
// 指揮を介して読み書きするプロパティ(Computedプロパティ)
class Circle {
// 半径
var radius: Double = 1.0
// 面積
var area: Double {
// 面積を返す
get {
return radius * radius * Double.pi
}
// 面積を設定する(半径を設定する)
set (menseki) {
radius = sqrt(menseki / Double.pi)
}
}
}
let myCircle = Circle()
// 初期値の半径と面積
print("半径: " + String(myCircle.radius))
print("面積: " + String(myCircle.area))
// 面積を2倍にする
myCircle.area *= 2
print("半径: " + String(myCircle.radius))
print("面積: " + String(myCircle.area))
// 半径を3にする
myCircle.radius = 3.0
print("半径: " + String(myCircle.radius))
print("面積: " + String(myCircle.area))
// クラスプロパティとインスタンスプロパティ
class Car {
// クラスプロパティ
static var count = 0
// インスタンスプロパティ
var moving = false
// インスタンスメソッド
func start() {
Car.count += 1
moving = true
}
func stop() {
if Car.count > 0 {
Car.count -= 1
moving = false
}
}
}
let car1 = Car()
let car2 = Car()
print("動いている車は" + String(Car.count) + "台です。")
car1.start()
car2.start()
print("動いている車は" + String(Car.count) + "台です。")
car2.stop()
print("動いている車は" + String(Car.count) + "台です。")
// エクステンションを使ったクラス拡張
class Player {
var name: String = ""
func hello() {
print("こんにちは、" + name + "さん。")
}
}
extension Player {
// 新しいメソッドを追加
func bye() {
print("さようなら、" + name + "さん。")
}
}
let player = Player()
player.name = "山田太郎"
player.hello()
player.bye()
// 継承を使ったクラス拡張
class Person {
var name: String = ""
func hello() {
print("Hello, " + name + ".")
}
}
class Japanese: Person {
func bye() {
print("さようなら、" + name + "さん。")
}
}
let japanese = Japanese()
japanese.name = "山田太郎"
japanese.hello()
japanese.bye()
// プロトコルでの実装強制
protocol GameProtocol {
var gamePoint: Int { get }
func hit()
func miss()
}
class MyGame: GameProtocol {
private var total = 0
var gamePoint: Int {
get {
return total
}
}
func hit() {
total += 10
}
func miss() {
total -= 10
}
}
■列挙型
// 基本的な列挙型
enum Size {
case S, M, L
}
let size = Size.M
if size == Size.S {
print("サイズはSです。")
} else if size == Size.M {
print("サイズはMです。")
} else if size == Size.L {
print("サイズはLです。")
}
// 値を割り当てた列挙型
enum Season: Int {
case Spring = 1
case Summer = 2
case Autom = 3
case Winter = 4
}
let spring = Season.Spring
let summer = Season.Summer
print(spring)
print(spring.rawValue)
print(summer)
print(summer.rawValue)
■構造体
// 基本的な構造体
struct ColorBox {
var width: Int
var height: Int
var color: String
}
let blueBox = ColorBox(width: 20, height: 30, color: "blue")
let redBox = ColorBox(width: 30, height: 40, color: "red")
// クラスプロパティ(タイププロパティ)を持った構造体
struct Ball {
// クラスプロパティ(タイププロパティとも呼ぶ)
static let madein = "日本"
static var material = "紙"
// インスタンスプロパティ
var radius: Double = 10.0
}
Ball.material = "木"
let ball1 = Ball(radius: 15)
let ball2 = Ball()
print(ball1.radius)
print(ball2.radius)
print(Ball.madein)
print(Ball.material)
// メソッドを持った構造体
struct Goods {
let price: Int
let count: Int
// 価格
func total() -> Int {
return price * count
}
}
let myGoods = Goods(price: 700, count: 4)
print(myGoods.total())