2020/02/01

Segue を利用せずに Storyboard の Storyboard ID を利用して present で画面遷移させる。 遷移先の UIViewController を明示的にクラス名を指定すると値を渡すことも可能

画面遷移

  • 遷移元:ViewController
  • 遷移先:PageViewController
  • Storyboard ID:page

let storyboard: UIStoryboard = self.storyboard!
let page = storyboard.instantiateViewController(identifier: "page") as! PageViewController
page.customValue = customValue
page.modalPresentationStyle = .fullScreen
page.modalTransitionStyle = .crossDissolve
self.present(page, animated: true, completion: nil)
  1. Storyboard から instantiateViewController() で PageViewController を生成
  2. 値を受け渡し
  3. 画面遷移先の画面スタイル、アニメーションを設定

.modalPresentationStyle、.modalTransitionStyle プロパティは、iOSバージョンによって異なる

.modalTransitionStyle


public enum UIModalTransitionStyle : Int {
    case coverVertical
    case flipHorizontal
    case crossDissolve
    @available(iOS 3.2, *)
    case partialCurl
}

.modalPresentationStyle


public enum UIModalPresentationStyle : Int {
    case fullScreen
    @available(iOS 3.2, *)
    case pageSheet
    @available(iOS 3.2, *)
    case formSheet
    @available(iOS 3.2, *)
    case currentContext
    @available(iOS 7.0, *)
    case custom
    @available(iOS 8.0, *)
    case overFullScreen
    @available(iOS 8.0, *)
    case overCurrentContext
    @available(iOS 8.0, *)
    case popover
    @available(iOS 7.0, *)
    case none
    @available(iOS 13.0, *)
    case automatic
}

  2020/01/30

Codable を利用して、JSONを 構造体の配列で扱ってみる

構造体を定義

JSONのデータにあわせて、Codable クラスの構造体を定義する。


struct HiraganaEntry: Codable {
    var word:String
    var kana:String
    var length:Int
}

Entityを定義

カスタムクラスのEntity の配列を定義する


var hiraganaEnties: [HiraganaEntry] = []

JSONファイルのパスを設定する

Bundle.main.path() でプロジェクト内の JSON ファイルのパスを作成する。

  • forResource: ファイル名
  • ofType: 拡張子

guard let path = Bundle.main.path(forResource: name, ofType: "json") else { return nil }

JSONを読み込む

ファイルパスから UTF-8 で String型で読み込む


let json:String
json = try String(contentsOfFile: path, encoding: .utf8)

JSONデコード

JSON(String)を、定義したEntity の配列でデコードする


let entries = try! jsonDecoder.decode([HiraganaEntry].self, from: (json.data(using: .utf8)!))

全体のコード


    let jsonDecoder = JSONDecoder()
    var hiraganaEnties: [HiraganaEntry] = []
    
    struct HiraganaEntry: Codable {
        var word:String
        var kana:String
        var length:Int
    }

    func getJSON(name:String) -> Codable? {
        let json:String
        guard let path = Bundle.main.path(forResource: name, ofType: "json") else { return nil }
        do {
            json = try String(contentsOfFile: path, encoding: .utf8)
        } catch _ {
            return nil
        }
        let entries = try! jsonDecoder.decode([HiraganaEntry].self, from: (json.data(using: .utf8)!))
        return entries
    }
    
    func loadHiragana() {
        hiraganaEnties = getJSON(name: "file_name") as! [GameViewController.HiraganaEntry]
        print(hiraganaEnties.randomElement())
    }

  2014/07/14

「Objective-C」とは全くことなる言語仕様「Swift」が登場しました。

基本はスクリプト言語仕様で理解はしやすそうですが、iOSフレームワーク・ライブラリを利用する事になるので、アプリを完成するには、結局「Xcode」「Objective-C」の知識は必須かな?

とは言え、まずは「Siwft」の文法を理解しようかと。

変数定義(mutable)

var name = "yoo";

定数定義(immutable)

let title = "Blog";
//title = "blog";  //再代入できない

リテラル定義

let age = 20; //Int型
let version = 1.1; //Double型
let title = "blog" //String型

明示的型定義

let tax:Float = 0.08;
let mile:Double = 100;

計算式

Stringを「"\(式)"」で連結できる。

let version = 1.1;
let versionString = "version \(version)"; // version 1.1

タプル

let yoo = ("Yohei Yoshikawa", 1975);
let (fullName, birthdayYear) = yoo;
println(fullName);
println(birthdayYear);
var yoo = (fullName: "Yohei Yoshikawa", birthdayYear: 1975);

Array定義

var citis : String[] = ["Tokyo", "Osaka", "Nagoya"];
citis.append("Sapporo");

Dictionary定義

var countries = ["JPN" : "Japan", "USA" : "America"];
let oldCountry = countries.updateValue("JAPAN", forKey: "JPN");
let country = countries["JPN"];

Enum

Enumに関数を埋め込み処理できる

enum city{
    case Tokyo, Osaka, Nagoya, Sapporo, Fukuoka, Yokohama, Sendai
    func region() ->String {
        switch self {
        case .Tokyo, .Yokohama:
            return "Kanto"
        case .Nagoya:
            return "Tokai"
        case .Osaka:
            return "Kansai"
        case .Fukuoka:
            return "Kyushu"
        case .Sendai:
            return "Tohoku"
        default :
            return ""
        }
    }
}
var currentCity = city.Nagoya;
println(currentCity.region());

if制御

    func isAdult(age:Int) -> Bool {
        if (age >= 20) {
            return true;
        } else {
            return false;
        }
    }

for制御

        let levels = [
            "level1": [1, 2, 3, 4, 5, 6],
            "level2": [7, 8, 9, 10, 11, 12],
            "level3": [13, 14, 15, 16, 17],
        ]
        for (key, level) in levels {
            println(key);
            for value in level {
                println(value);
            }
        }
        for i in 0..5 {
            println(i);
        }

        for i in 0...5 {
            println(i);
        }

        var rate = 3;
        var total = 1;
        for _ in 1...5 {
            total *= rate;
            println(total);
        }

While制御

        println("while");
        var i:Int = 5;
        while (0 <= i) {
            println(i);
            i--;
        }

Optional

「nil」を代入可能にする

var title2:String? = "Swift";
title2 = nil;
println(title2?);
println(title2!); //nilの場合実行エラー

関数デフォルト値

func calculate(price: Float , tax: Float = 3) -> Float {
    let totalPrice = Float(price) * tax;
    return totalPrice;
}

関数可変長引数

var string = concatString("A", "B");
println(string);

    func concatString(values: String...) -> String {
        var string = "";
        for value in values {
            string += value;
        }
        return string;
    }

型の関数拡張

extension Double {
    func km() -> Double {return self * 1.609344}
}
let mile = 100;
let km = mile.km(); //160.9344
<< Top < Prev Next > Last >>