Segue を利用せずに Storyboard の Storyboard ID を利用して present で画面遷移させる。 遷移先の UIViewController を明示的にクラス名を指定すると値を渡すことも可能
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)
.modalPresentationStyle、.modalTransitionStyle プロパティは、iOSバージョンによって異なる
public enum UIModalTransitionStyle : Int {
case coverVertical
case flipHorizontal
case crossDissolve
@available(iOS 3.2, *)
case partialCurl
}
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
}
Codable を利用して、JSONを 構造体の配列で扱ってみる
JSONのデータにあわせて、Codable クラスの構造体を定義する。
struct HiraganaEntry: Codable {
var word:String
var kana:String
var length:Int
}
カスタムクラスのEntity の配列を定義する
var hiraganaEnties: [HiraganaEntry] = []
Bundle.main.path() でプロジェクト内の JSON ファイルのパスを作成する。
guard let path = Bundle.main.path(forResource: name, ofType: "json") else { return nil }
ファイルパスから UTF-8 で String型で読み込む
let json:String
json = try String(contentsOfFile: path, encoding: .utf8)
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())
}
「Objective-C」とは全くことなる言語仕様「Swift」が登場しました。
基本はスクリプト言語仕様で理解はしやすそうですが、iOSフレームワーク・ライブラリを利用する事になるので、アプリを完成するには、結局「Xcode」「Objective-C」の知識は必須かな?
とは言え、まずは「Siwft」の文法を理解しようかと。
var name = "yoo";
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);
var citis : String[] = ["Tokyo", "Osaka", "Nagoya"];
citis.append("Sapporo");
var countries = ["JPN" : "Japan", "USA" : "America"];
let oldCountry = countries.updateValue("JAPAN", forKey: "JPN");
let country = countries["JPN"];
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());
func isAdult(age:Int) -> Bool {
if (age >= 20) {
return true;
} else {
return false;
}
}
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);
}
println("while");
var i:Int = 5;
while (0 <= i) {
println(i);
i--;
}
「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