20200704のSwiftに関する記事は13件です。

XcodeでSwiftのバージョンを確認する

★XcodeでのSwiftバージョン確認方法

現在Xcodeで開発しているものは、
果たしてSwift4・・? それとも、5・・・?というときの確認方法をまとめました!

①[プロジェクト名(キャプチャ内ではmemo)]を選択
②[Build Settings]▶︎TARGETS>[memo]▶︎[Basic]▶︎[Levels]と順に選択
③検索窓に[Swift]と入力してEnter
④[Swift Language version]が該当箇所!(キャプチャではSwift5)

スクリーンショット 2020-07-04 19.53.35.png

ちなみに・・・
 インストール済みのSwiftバージョンの確認方法は以下

①ターミナルを起動
②以下をコピペ
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -v
③Enter!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

iOSアプリの作成(ボタンとラベルのみのシンプルコード)

前提

ボタンとラベルを追加

MainStoryboardにボタンとラベルを追加する
image.png

Buttonをドラッグ
image.png

配置したい場所ではなす
image.png

ラベルやフォントを変更する
image.png

(参考)サイズが異なるiPhoneでも同じ位置に表示されるようにするには、Autoresizingの設定を変更する
image.png

同様の方法でラベルを配置する
image.png

(参考)Autoresizingの設定
image.png

ラベルを参照するOutletコードを追加

Assistantビューを表示してレイアウトとコードが両方表示されるようにする
image.png

不要なペインを非表示にして広く表示できるようにする
image.png

(非表示にした後)
image.png

Control を押しながらラベルをコードにドラッグし、Outletを追加する
image.png

Outlet名をつけてConnect
image.png

コードが追加される
image.png

ボタン押下時のActionコードを追加

Controlを押しながらボタンをコードにドラッグしてActionを追加する
image.png

Action名をつけてConnect
image.png

Actionのコードが追加される
image.png

ボタン押下時にLabelのテキストが変わるコードを追記する

ViewController.swift
    @IBAction func execute(_ sender: Any) {
        resultLabel.text = "実行しました"
    }

シミュレーターで動作確認

シミュレーターで実行して動作確認
image.png

image.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[RxSwift]flatMap系とcombineLatestの違い

flatMap系

使い方

a.flatMap(b),a.flatMapFirst(b), a.flatMapLatest(b)等

特徴

aのonNextの処理に、bのonNextの全処理を掛け合わせていく。

aへのある要素への掛け合わせる処理が終わらないうちに、aへさらに次の要素が流れてきた場合、
flatMapFirstは次の要素を無視する
flatMapLatestは現在の要素をキャンセルし次の要素の処理を行う
flatMapは次の要素も現在の要素も両方行う。

combineLatest

使い方

Observable.combineLatest(a, b) { $0 + $1 }等

特徴

aとbの最新の要素を掛け合わせる。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Swift] カスタムstructを簡単にUserDefaultsに保存する <NSCodingは捨てよう>

NSCoding意味わかんない

意味分かんない

UserDefaultsに保存できるデータ型

UserDefaultsに保存できるデータ型は
数値型
文字列型
真偽型
データ型(Data、NSData)
とこれらを値とする
配列型
辞書型(キーは文字列型に限る)
のみとなっています。

非対応のデータ型を保存する方法 その1

保存できるデータ型(Data,NSDataを除く)に変換する。

例えば CGRect を数値の配列に変換して保存するなどです。

extension UserDefaults {
  func set(_ value: CGRect, forKey key: String) {
    let rectDataArray = [value.origin.x, value.origin.y, value.width, value.height]
    set(rectDataArray, forKey: key)
  }

  func cgRect(forKey key: String) -> CGRect? {
     guard let rectDataArray = array(forKey: key) as? [CGFloat] else { return nil }
     guard rectDataArray.count == 4 else { return nil }
     return CGRect(x: rectDataArray[0], y: rectDataArray[1], width: rectDataArray[2], height: rectDataArray[3])
  }
}

非対応のデータ型を保存する方法 その2

その1で数値や文字列にするのが難しいデータ型の場合はデータ(NSData/Data)に変換して保存します。
その助けをするのがNSCodingプロトコルとNSKeyedArchiver/NSKeyedUnarchiverです。

これをやりたくない趣旨のエントリですので詳細は省きます。

非対応のデータ型を保存する方法 その3

実はSwiftにはNSCodingを使わなくてもデータ型をデータ(NSData/Data)に簡単に変換してもらえる便利なものがあります。
Codable = Encodable & Decodable
です。

Codableへの準拠は変わったデータ型ではない限り、コンパイラが自動で行ってくれるのがすごくうれしい!

これを使わない手はありません。
ここではCoderとしてJSON(En/De)coderを使用しました。

extension UserDefaults {
  func setEncoded<T: Encodable>(_ value: T, forKey key: String) {
    guard let data = try? JSONEncoder().encode(value) else {
       print("Can not Encode to JSON.")
       return
    }

    set(data, forKey: key)
  }

  func decodedObject<T: Decodable>(_ type: T.Type, forKey key: String) -> T? {
    guard let data = data(forKey: key) else {
      return nil
    }

    return try? JSONDecoder().decode(type, from: data)
  }
}

CGRectを保存してみましょう。
CGRectはCodableに準拠してますので特に何か付け加える必要はありません。

let cgRect = CGRect(x: 0, y: 0, width: 100, height: 100)

UserDefaults.standard.setEncoded(cgRect, forKey: "KEY")

// storedCGRect's type is CGRect.
let storedCGRect = UserDefaults.standard.decodedObject(CGRect.self, forKey: "KEY")

はい、簡単、型安全。

とくにまとめることはない

簡単さと標準準拠を肝としたのでUserDefaultsのKeyがStringで危険なままですが、そのあたりは別にいろいろあるのでググったりなんだりすればいいと思う。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Swift】ScrollViewがカクつく時の対処法

下記ブログの転載です!
https://rc-code.info/ios/post-273/

iOSにて、UIScrollView のカクつきを改善する必要があったので備忘録。
今回は UIScrollViewDelegate.scrollViewDidScroll を利用している時の対処法を紹介します。
 

UIScrollViewがカクつく理由

まず UIScrollView に限らず描画がカクつく場合、その理由は mainthread を圧迫していることがほとんどです。

mainthread については、こちらを参考にしていただければと思います。

scrollViewDidScroll内の処理を見直す

さて、今回解決したいのは UIScrollView のカクつきですが、scrollViewDidScroll という UIScrollView.Delegate の処理が重たくなりすぎているというケースがよく見られます。

後述する対策は scrollViewDidScroll だけでなく、他の UIScrollView.Delegate の関数にも有効な場合があるので、参考にしてみてください。

UIScrollView のカクつきを再現する負荷試験

下記は extension で scrollViewDidScroll を定義したサンプルになります。


extension ViewController: UIScrollViewDelegate {

    func scrollViewDidScroll(_ scrollView: UIScrollView) {

        var count: Int = 0
        var array: [Int] = []
        repeat {
            array.append(count)
            array.reverse()
            count += 1
        } while(count < 200)
    }
}

上記のソースでは、スクロールされる度に 0〜199 までの数字を配列に格納してはリバースするという再帰処理を行なっています。

count を array に格納しリバース、countに+1 (array=[0]、count=1 になる)
count を array に格納しリバース、countに+1 (array=[1,0]、count=2 になる)
  以下、199まで繰り返し、、、

この処理が少しでもスクロールされる度に行われるので、なかなか重いタスクとなります。
scrollViewDidScroll という関数は、スクロール というUI操作に紐づいているので、この重たい処理は mainthread にて処理されてしまいます。
つまり、scrollViewDidScroll 関数内に負荷がかかると画面更新に影響するということです。
実際にこの処理を加えてUIScrollViewをスクロールしていただくと、カクつくことが分かると思います。

カクつきを解消する方法

class ViewController: UIViewController {

        //スクロール処理用Queue
    private let scrollSessionQueue = DispatchQueue(label: "ScrollSessionQueue")

        ...以下省略
}

extension ViewController: UIScrollViewDelegate {

    func scrollViewDidScroll(_ scrollView: UIScrollView) {

        // mainthread を圧迫しないように、別スレッドで処理
        scrollSessionQueue.async {

            var count: Int = 0
            var array: [Int] = []
            repeat {
                array.append(count)
                array.reverse()
                count += 1
            } while(count < 200)
        }
    }
}

上記のソースでは、ViewController に scrollLogSessionQueue というQueueを新たに呼び出しています。

そして scrollViewDidScroll 内の処理を scrollSessionQueue.async で囲むことで、処理を mainthread から別threadに移譲しています。
すなわち、処理は mainthread ではなく、UIに関連しない別の thread にて処理されることになります。

実際に動かしてみると、スクロールが滑らかになっていることが分かると思います。
DispatchQueue の詳しい生成方法については こちら を参考にしていただければと思います。

修正後の注意点

ただ、別threadにて処理を行う際には注意が必要です。
主に挙げられる注意点は

①別threadにすれば100%画面更新に影響がなくなるわけではない
②別threadに移譲するので、実行タイミングがズレる

という2点です。

①についてですが、 scrollLogSessionQueue.async で別スレッドを使ってもCPUやGPUが圧迫されることは免れませんし、別スレッド内の処理によっては再度 mainthread への移譲が行われるという事もあり得ます。
なので100%影響がなくなるというわけではありません。
サンプルコード scrollLogSessionQueue.async の中で行われている処理の負荷を上げていくと、この事が分かるかと思います。

②について、指定したthreadに処理を移譲するので、当然ながら処理は画面と同期しません。
画面的にはスムーズにスクロールしたり、スクロールが既に完了していても、scrollLogSessionQueue.async 内の処理が同様に完了しているとは限らないので、注意が必要です。
 

検証Playground

検証Playground Git
 

検証環境

Mac: 10.14.4
XCode: 10.2
Swift: 5.0
 

参考ドキュメント

公式 DispatchQueue ドキュメント
公式 UIScrollView ドキュメント
 
 

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Swift】WKWebViewでJavaScriptのコールバックを受けつける(WKUserContentControllerの使い方)

下記ブログの転載です!
https://rc-code.info/ios/post-194/

iOSにて、WKWebView でJavaScriptのコールバックを受けつける必要があったので備忘録。
今回は WKUserContentController を利用した方法を紹介します。
 

WKWebView の使い方

まずは WKWebView の基本的な使い方ですが、こちらを参考にしていただければと思います。
 

WKUserContentController の使い方

WKUserContentControllerはJavaScriptからのコールバック受信や、スクリプトをWebビューに挿入する方法を提供します。
下記が導入のサンプルコードです。


import UIKit
import WebKit

class ViewController: UIViewController {

    var webView: WKWebView!

    override func loadView() {

        // ① WKUserContentController の生成
        let userContentController = WKUserContentController()
        // ② WKUserContentController にコールバックハンドラを登録
        userContentController.add(self, name: "jsCallbackHandler")

        let webConfiguration = WKWebViewConfiguration()
        // ③ WKWebViewConfiguration に生成した WKUserContentController を登録する
        webConfiguration.userContentController = userContentController

        webView = WKWebView(frame: .zero, configuration: webConfiguration)
        view = webView
    }
}

// ④ WKScriptMessageHandler のデリゲートを記載
extension ViewController: WKScriptMessageHandler {

    // ⑤ JavaScript から呼び出されるコールバックハンドラ関数を記載
    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        switch message.name {
            case "jsCallbackHandler":
                print("Javascript message arrived: jsCallbackHandler")
            default:
                return
        }
    }
}

1 WKUserContentController の生成

WKUserContentControllerはWKWebViewConfigurationに格納する必要があるので、まずはインスタンスを生成します。
 

2 WKUserContentController にコールバックハンドラを登録

WKUserContentControllerのadd関数を用いて、JavaScriptから実行したい関数を持つクラスインスタンス(WKScriptMessageHandlerプロトコルに準拠したクラス)を第一引数に設定し、コールバックの判別に利用するためのStringをname引数に設定します。
このadd関数は何度も実行できるので、複数のコールバックを処理したい場合はname引数を変更して実行すれば、後述するコールバック関数内で判定することができます。
 

3 WKWebViewConfiguration に生成した WKUserContentController を登録する

生成したWKUserContentControllerインスタンスは、WKWebViewConfigurationのuserContentControllerプロパティに格納します。
 

4 WKScriptMessageHandler のデリゲートを記載

上記ViewControllerはデリゲート先としてWKUserContentControllerに渡され登録されているので、WKScriptMessageHandlerプロトコルに準拠させる必要があります。
 

5 JavaScript から呼び出されるコールバックハンドラ関数を記載

WKScriptMessageHandlerプロトコルに準拠させるために、userContentController関数を実装します。この関数を実装する事で、Javascriptからのコールバックを受け付けることができるようになります。

JSからは下記のように、②の箇所のadd関数にてname引数に指定したコールバックを実行します。

    webkit.messageHandlers.jsCallbackHandler.postMessage("Message from Javascript");

コールバックハンドラ内ではmessage.nameプロパティでコールバック名を取得することができるので、サンプルコードのようにswitch文等で判定する事で、処理を分岐させる事ができます。
 

検証Playground

検証Playground Git
 

検証環境

Mac: 10.13.6
XCode: 10.1
Swift: 4.2.1
 

参考ドキュメント

公式 WKWebView ドキュメント
公式 WKWebViewConfiguration ドキュメント
公式 WKUserContentController ドキュメント
 
 

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Swift】WKWebViewの基本的な使い方

下記ブログの転載です!
https://rc-code.info/ios/post-241/

iOSにて、Webページを表示する必要があったので、WKWebView の基本的な使い方を備忘録。
 

WKWebView の使い方

WKWebView の基本的な使い方です。
下記が公式のサンプルコードです。

WKWebView を利用する際は UIKit と WebKit を import します。
WKWebView の initialize は CGRect と WKWebViewConfiguration を引数にとります。
該当するURLページを開くには、WKWebView の load関数 を実行します。

import UIKit
// 1 WebKit の import
import WebKit

class ViewController: UIViewController {

    var webView: WKWebView!

    override func loadView() {

        // 2 WKWebViewConfiguration の生成
        let webConfiguration = WKWebViewConfiguration()
        // 3 WKWebView に Configuration を引き渡し initialize
        webView = WKWebView(frame: .zero, configuration: webConfiguration)
        // 4 WKUIDelegate の移譲先として self を登録
        webView.uiDelegate = self
        // 5 WKNavigationDelegate の移譲先として self を登録
        webView.navigationDelegate = self
        // 6 view に webView を割り当て
        view = webView
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // 7 URLオブジェクトを生成
        let myURL = URL(string:"https://www.apple.com")
        // 8 URLRequestオブジェクトを生成
        let myRequest = URLRequest(url: myURL!)

        // 9 URLを WebView にロード
        webView.load(myRequest)
    }
}

// MARK: - 10 WKWebView ui delegate
extension ViewController: WKUIDelegate {
    // delegate
}

// MARK: - 11 WKWebView WKNavigation delegate
extension ViewController: WKNavigationDelegate {
    // delegate
}

 

1 WebKit の import

WebView関連のコードを扱うにはWebKitをimportする必要があります。
冒頭にimport WebKitを記載すると、XcodeにてWebView関連の補完が効くようになるかと思います。

2 WKWebViewConfiguration の生成

WKWebViewConfigurationはWKWebViewの初期化時に参照される設定プロパティが含まれるクラスです。
WKWebViewConfigurationを使用すると、Webページがレンダリングされるまでの時間、メディア再生の処理方法、ユーザーが選択できるアイテムの細分性、およびその他の多くのオプションを決定できます。

WKWebViewConfigurationは、WKWebViewが最初に初期化されたときにのみ使用されます。このクラスを使用して、WKWebViewの作成後にその設定を変更することはできません。

3 WKWebView を initialize

WKWebViewの初期化にはframe引数にWebViewのサイズ、configuration引数に生成したWKWebViewConfigurationのインスタンスを引き渡します。

4 WKUIDelegate の移譲先として self を登録

WKWebViewのuiDelegateプロパティにselfをセットする事で、インターフェースに関わるWebViewの関数をクラス内で扱う事ができるようになります。

5 WKNavigationDelegate の移譲先として self を登録

WKWebViewのnavigationDelegateプロパティにselfをセットする事で、振る舞いに関わるWebViewの関数をクラス内で扱う事ができるようになります。

6 view に webView を割り当て

生成したWKWebViewのインスタンスをControllerのviewに割り当てます。

7 URLオブジェクトを生成

表示したいURLのStringをURLクラスのstring引数に指定し、インスタンスを生成します。

8 URLRequestオブジェクトを生成

生成したURLクラスのインスタンスをURLRequestクラスのurl引数に指定し、インスタンス生成します。

9 URLを WebView にロード

WKWebViewのload関数にURLRequestインスタンスを引き渡し、実行します。
この関数を叩くことで、webViewのリクエストが走ります。

10 WKWebView ui delegate

WKWebView ui delegate の部分には、WKWebViewのインターフェースに関わるdelegate関数を記述します。
詳細は公式ドキュメント参照。
 

11 WKWebView WKNavigation delegate

WKWebView WKNavigation delegate の部分には、WebViewの振る舞いに関わるdelegate関数を記述します。
詳細は公式ドキュメント参照。
 

実行環境

Mac: 10.13.6
XCode: 10.1
Swift: 4.2.1
 

参考ドキュメント

公式 WKWebView ドキュメント
公式 WKWebView ui delegate ドキュメント
公式 WKWebView WKNavigation delegate ドキュメント
 
 

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Swift】WKPreferences の minimumFontSize が効かない

下記ブログの転載です!
https://rc-code.info/ios/post-236/

iOSのWKWebViewConfigrationに設定するWKPreferencesのminimumFontSizeが効かないケースがあったので調査&備忘録。
 

WKWebView の使い方

WKWebViewの基本的な使い方に関しては こちら にまとめております。
合わせてご覧ください。
 

WKPreferences minimumFontSize の設定方法

WKPreferencesはWebビューの基本設定をカプセル化するオブジェクトです。(公式ドキュメント)
このうちminimumFontSizeはptサイズでフォントの最小サイズを決めるプロパティです。
まずは使い方を記載します。
 


import UIKit
// ① WebKit の import
import WebKit

class ViewController: UIViewController {

    var webView: WKWebView!

    override func loadView() {

        // ② WKWebViewConfiguration の生成
        let webConfiguration = WKWebViewConfiguration()
        // ③ WKPreferences の生成
        let preferences = WKPreferences()
        // ④ WKPreferences の minimumFontSize プロパティに値を指定
        preferences.minimumFontSize = 100.0
        // ⑤ WKWebViewConfiguration に WKPreferences のインスタンスを設定
        webConfiguration.preferences = preferences
        // ⑥ WKWebView に Configuration を引き渡し initialize
        webView = WKWebView(frame: CGRect(x: 150, y: 200, width: 200, height: 20), configuration: webConfiguration)
        // ⑦ view に WKWebView を割り当て
        view = webView
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        loadView()
        webView.load(URLRequest(url: URL(string: "https://www.apple.com/")!))
    }
}

 

上記のように、まずWKPreferencesのインスタンスを生成し、このプロパティであるminimumFontSizeに最小サイズにしたいフォントサイズをpt換算で指定します。
 

そしてWKPreferencesインスタンスをWKWebViewConfigurationにセットし、このWKWebViewConfigurationをWKWebViewの設定として使います。
 

minimumFontSize が効かないケース

さて本題ですが、このWebViewで様々なサイトを見てみると、minimumFontSizeを設定しているにも関わらず、指定フォントサイズ以下なってしまう場合が見受けられます。

検証した結果、この事象にはCSSのtext-size-adjustというスタイルが影響していることが分かりました。
 

text-size-adjust スタイルとは?

text-size-adjust (ベンダープレフィックスだと-webkit-text-size-adjust) は、一部のデバイスで使われるテキストの自動拡大アルゴリズムを制御するスタイルです。
対応していないブラウザーはこのプロパティを無視します。

一部のモバイル端末には、縦向き (Portrate) と横向き (Landscape) が切り替わった際に文字サイズを自動調整する機能があり、text-size-adjustはこの自動調整を制御します。
 

text-size-adjust が設定されると minimumFontSize が効かなくなる

検証を行なった結果、text-size-adjustによって縮小されたサイズはminimumFontSizeによって制限されたフォントサイズよりも小さくなることが分かりました。

念の為、その他のスタイル指定でフォントサイズの制限が無視されないか検証しています。
 

検証内容

最下部 Playground の Resources ディレクトリに様々なスタイル定義によるフォントサイズ変更を含んだHTMLファイルを用意しました。
minimumFontSizeを設定した WKWebViewにて、このHTMLをそれぞれ表示した結果、text-size-adjustを設定したHTMLのみ、minimumFontSizeで指定した値よりフォントサイズが小さくなりました。
 

下記画像が、minimumFontSizeに100を設定し、上部テキストに様々なスタイル定義で40px相当のフォントサイズを指定した画像です。
下記テキストは比較用のプレーンなテキストです。

通常スタイル適用画像

見た通り、スタイルで指定された40pxを無視し、minimumFontSizeに指定されている100pt相当の大きさで表示されています。
 

変わって次の画像がtext-size-adjustにを指定した時の画像です。

text-size-adjust適用画像

こちらの上部テキストでは、スタイルで指定された40pxが無視され、minimumFontSizeに指定されている100ptが適用されるはずですが、text-size-adjustに指定している10%が適用され、4px (40pxの10%)相当の大きさになっています。
 

まとめ

全ての要素・スタイルを検証できているわけではないので確実ではないですが、WKPreferencesのminimumFontSizeを指定しているのにフォントが想定以下のサイズになってしまうようであれば、text-size-adjustの設定を疑ってみるのが良いかもしれません。
 
 

検証Playground

検証Playground Git
 

検証環境

Mac: 10.13.6
XCode: 10.1
Swift: 4.2.1
 

参考ドキュメント

WebKit
WKWebViewConfiguration
WKPreferences
text-size-adjust
 
 

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

名古屋で開催されている技術イベント・勉強会

はじめに

この度、名古屋を離れ、関東へ引っ越すことになりました。名古屋(東海圏)エンジニアを増やして地元を盛り上げていくという夢が叶わなくなってしまいました。

名古屋でもエンジニアコミュニティを盛り上げようと頑張っている企業さんや、エンジニアさんがたくさんいることを多くの人に共有したくこの記事を書いています。

名古屋へのUターンを考えていたり、リモートができるようになり都心を離れようかなぁと考えている人は、ぜひ次の拠点として名古屋を選択に入れる参考にしてみてください。

*以下イベント情報の概要はリンクページから一部引用させていただいています。

定期開催編

以下、定期開催されている勉強会です。

Yahoo! JAPAN Nagoya

主催:Yahoo! JAPAN
概要:ヤフー株式会社の名古屋オフィスで開催するクリエイター向け勉強会コミュニティ。 多種多様なクリエイター同士が交流できる場所として、開発スキルやノウハウについて学びながら、社内外のクリエイターがアウトプット/インプットできる機会になるべく、2019年3月にスタート。

フロントエンドもくもく会

主催:Nagoya Frontend User Group
概要:フロントエンドを中心にしたもくもく会。名古屋の企業・団体からの会場提供を受けている。

名古屋アジャイル勉強会

概要:アジャイルの考え方や方法を体験的に学び、職場で活かすことを応援する、誰でも参加できるグループ。

Mobile Act

主催:フェンリル
概要:モバイルアプリ開発関連の情報共有や参加者同士の交流を目的とした勉強会。

Nagoya.Swift+

概要:技術者としての好奇心や向上心を満たすために技術的な挑戦をするふりをして遊びます。

nagoya.go

概要:名古屋のGoコミュニティ。もくもく会やGo勉強会が開催されている。

OthloTech

主催:OthloTech
概要:OthloTech<オスロテック>は東海圏の学生エンジニア・デザイナーによる学校を超えたコミュニティ。 月に1〜2回、学生限定の勉強会やハッカソンを開催。

JAWS-UG名古屋

主催:JAWS-UG名古屋支部
概要:Amazon Web Services(AWS)のユーザグループ、JAWS-UGの名古屋支部のイベント。
AWSに興味があるんだけど周りに知ってる人がいない、がっつり勉強したい!という人たちが集い、一緒に勉強する場を企画。

MISO MOKU

主催:Misoca Developer Meetup
概要:毎週ベースで行われていた、エンジニア・デザイナー向けのもくもく会。弥生株式会社と合併したため、2020年7月以降の開催は未定。

Nagoya.unity

概要:名古屋を中心に活動を行うUnityユーザのコミュニティで、主に勉強会などの開催を行っています。

OWASP Nagoya

主催:OWASP Nagoya Chapter
概要:Webをはじめとするソフトウェアのセキュリティ環境の現状、またセキュアなソフトウェア開発を促進する技術・プロセスに関する情報共有と普及啓発を目的としたプロフェッショナルの集まる、オープンソース・ソフトウェアコミュニティ。

名古屋ギークバー

概要:技術的なものから、アナログゲーム、LT大会、生ハムを食べるなど、幅広くイベントを開催され、名古屋のギークな人達に会える。

Nagoya.php

概要:名古屋のPHPユーザーのコミュニティで、隔月で勉強会をやっています。(現在コロナのため休止中)

番外編

開催頻度が低いけど大規模だったり、面白い試みをしているイベントを書いていきます。

NGK

概要:NGKは、東海地方IT系コミュニティ合同の大新年会。普段から東海地方の勉強会に参加している人、今まで参加したことがない人、他地域の人など、 誰にとっても、さまざまなコミュニティとつながりを広げ、深める良い機会になることを目指すイベント。

東海のエンジニアはみんな参加しているのではないか?と思うぐらい大規模なイベント。

みそかつウェブ

概要:名古屋という土地を生かし、エンジニア&デザイナーコミュニティを盛り上げるため、 IT業界に関わる人同士の交流の場として似た境遇の仲間を探したり、相談できる友人を作ったりできるコミュニティです。

最後に

思いついたイベントをばっと書いているので、どんどん追記していきます。他もあるよ~みたいなご意見ありましたら是非いただけますと嬉しいです。

コミュニティも盛り上がっているので、ぜひ色々参加してみてください。
割とアットホームな土地(外からはそう思われていないかもしれないが)なので、いいですよ~。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

名古屋で開催されいている技術イベント・勉強会

はじめに

この度、名古屋を離れ、関東へ引っ越すことになりました。名古屋(東海圏)エンジニアを増やして地元を盛り上げていくという夢が叶わなくなってしまいました。

名古屋でもエンジニアコミュニティを盛り上げようと頑張っている企業さんや、エンジニアさんがたくさんいることを多くの人に共有したくこの記事を書いています。

名古屋へのUターンを考えていたり、リモートができるようになり都心を離れようかなぁと考えている人は、ぜひ次の拠点として名古屋を選択に入れる参考にしてみてください。

*以下イベント情報の概要はリンクページから一部引用させていただいています。

定期開催編

以下、定期開催されている勉強会です。

Yahoo! JAPAN Nagoya

主催:Yahoo! JAPAN
概要:ヤフー株式会社の名古屋オフィスで開催するクリエイター向け勉強会コミュニティ。 多種多様なクリエイター同士が交流できる場所として、開発スキルやノウハウについて学びながら、社内外のクリエイターがアウトプット/インプットできる機会になるべく、2019年3月にスタート。

フロントエンドもくもく会

主催:Nagoya Frontend User Group
概要:フロントエンドを中心にしたもくもく会。名古屋の企業・団体からの会場提供を受けている。

名古屋アジャイル勉強会

概要:アジャイルの考え方や方法を体験的に学び、職場で活かすことを応援する、誰でも参加できるグループ。

Mobile Act

主催:フェンリル
概要:モバイルアプリ開発関連の情報共有や参加者同士の交流を目的とした勉強会。

Nagoya.Swift+

概要:技術者としての好奇心や向上心を満たすために技術的な挑戦をするふりをして遊びます。

nagoya.go

概要:名古屋のGoコミュニティ。もくもく会やGo勉強会が開催されている。

OthloTech

主催:OthloTech
概要:OthloTech<オスロテック>は東海圏の学生エンジニア・デザイナーによる学校を超えたコミュニティ。 月に1〜2回、学生限定の勉強会やハッカソンを開催。

JAWS-UG名古屋

主催:JAWS-UG名古屋支部
概要:Amazon Web Services(AWS)のユーザグループ、JAWS-UGの名古屋支部のイベント。
AWSに興味があるんだけど周りに知ってる人がいない、がっつり勉強したい!という人たちが集い、一緒に勉強する場を企画。

MISO MOKU

主催:Misoca Developer Meetup
概要:毎週ベースで行われていた、エンジニア・デザイナー向けのもくもく会。弥生株式会社と合併したため、2020年7月以降の開催は未定。

Nagoya.unity

概要:名古屋を中心に活動を行うUnityユーザのコミュニティで、主に勉強会などの開催を行っています。

OWASP Nagoya

主催:OWASP Nagoya Chapter
概要:Webをはじめとするソフトウェアのセキュリティ環境の現状、またセキュアなソフトウェア開発を促進する技術・プロセスに関する情報共有と普及啓発を目的としたプロフェッショナルの集まる、オープンソース・ソフトウェアコミュニティ。

名古屋ギークバー

概要:技術的なものから、アナログゲーム、LT大会、生ハムを食べるなど、幅広くイベントを開催され、名古屋のギークな人達に会える。

Nagoya.php

概要:名古屋のPHPユーザーのコミュニティで、隔月で勉強会をやっています。(現在コロナのため休止中)

番外編

開催頻度が低いけど大規模だったり、面白い試みをしているイベントを書いていきます。

NGK

概要:NGKは、東海地方IT系コミュニティ合同の大新年会。普段から東海地方の勉強会に参加している人、今まで参加したことがない人、他地域の人など、 誰にとっても、さまざまなコミュニティとつながりを広げ、深める良い機会になることを目指すイベント。

東海のエンジニアはみんな参加しているのではないか?と思うぐらい大規模なイベント。

みそかつウェブ

概要:名古屋という土地を生かし、エンジニア&デザイナーコミュニティを盛り上げるため、 IT業界に関わる人同士の交流の場として似た境遇の仲間を探したり、相談できる友人を作ったりできるコミュニティです。

最後に

思いついたイベントをばっと書いているので、どんどん追記していきます。他もあるよ~みたいなご意見ありましたら是非いただけますと嬉しいです。

コミュニティも盛り上がっているので、ぜひ色々参加してみてください。
割とアットホームな土地(外からはそう思われていないかもしれないが)なので、いいですよ~。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

iOS 13 rootViewController 切替メモ

rootViewController 切替

iOS 13 から rootViewController の持ち方が SceneDelegate に代わりました。rootViewController切り替えの例です。

UIWindow, rootViewController の扱い

UIWindow, rootViewControllerは SceneDelegate で管理します。
ビューコントローラーを切り替えたい場合は、次のようにします。

let sceneDelegate = UIApplication.shared.connectedScenes.first!.delegate as! SceneDelegate
sceneDelegate.window!.rootViewController = 新しいビューコントローラー

アニメーション効果

上記だけでと一瞬で画面が切り替わってしまうので、若干のアニメーション効果をつけてみます。
UIWindow間でのaddSubviewなどもできなくなってるっぽいので、やり方の例としてこんな風な処理をおこなっています。
1.遷移元の画面を画像化し、遷移先の画面に配置
2.rootViewController を入れ替える
3.アニメーションを利用して 1.の画像を透明化して削除

まず先にUIViewを画像化する処理を作成します。

extension UIView {
    // UIVIewを画像化
    func GetImage() -> UIImage {
        // キャプチャする範囲を取得.
        let rect = self.bounds
        // ビットマップ画像のcontextを作成.
        UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
        let context: CGContext = UIGraphicsGetCurrentContext()!
        // 対象のview内の描画をcontextに複写する.
        self.layer.render(in: context)
        // 現在のcontextのビットマップをUIImageとして取得.
        let capturedImage : UIImage = UIGraphicsGetImageFromCurrentImageContext()!
        // contextを閉じる.
        UIGraphicsEndImageContext()
        return capturedImage
    }
}

rootViewController を切り替える処理を作成します。

extension UIViewController {
    // rootViewController を入れ替える画面遷移
    func moveTo(_ viewController: UIViewController) {
        // 元画面の画像をセット
        let imageView = UIImageView(image: self.view.GetImage())
        viewController.view.addSubview(imageView)

        // rootViewController入れ替え
        let sceneDelegate = UIApplication.shared.connectedScenes.first!.delegate as! SceneDelegate
        sceneDelegate.window!.rootViewController = viewController

        // 元画面の画像を削除
        UIView.animate(withDuration: 0.5, animations: {
            imageView.alpha = 0.0
        }, completion: { _ in
            imageView.removeFromSuperview()
        })
    }
}

self.moveTo(遷移先のビューコントローラー) で処理を実装できます。

Simulator Screen Shot - iPhone 11 Pro - 2020-07-04 at 02.33.43.png Simulator Screen Shot - iPhone 11 Pro - 2020-07-04 at 02.33.46.png Simulator Screen Shot - iPhone 11 Pro - 2020-07-04 at 02.34.01.png Simulator Screen Shot - iPhone 11 Pro - 2020-07-04 at 02.34.02.png
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Swift5]paizaでよく使う文法メモ

背景

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

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

よく使うコード

標準入力

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

//複数行 
/*
例:
8
2
3
*/
let input_line1 = readLine()!
let input_line2 = readLine()!
let input_line3 = readLine()!

//複数行 もっと多いときとか
var strs = [String]()
for _ in 0..<8 {
   strs.append(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)!})
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: "さようなら") //はじめましてさようなら
}

配列並び替え

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()は配列を書き換えない

配列初期化

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

配列絞り込み

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

絶対値

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 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

大文字・小文字

let a = "swift".uppercased()
let b = "SWIFT".lowercased()

終わりに

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

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

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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

背景

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

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

よく使うコード

標準入力

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

//複数行 
/*
例:
8
2
3
*/
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)!})
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: "さようなら") //はじめましてさようなら
}

配列並び替え

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()は配列を書き換えない

配列初期化

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

配列絞り込み

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

絶対値

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 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

大文字・小文字

let a = "swift".uppercased()
let b = "SWIFT".lowercased()

終わりに

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

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

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む