読者です 読者をやめる 読者になる 読者になる

Swift,Objective-Cプログラミング ~ iOS ~

Objective-C,Swift,Apple Watchなどのプログラミング

【iOS Swift入門 #282】独自クラスの配列を拡張(extension)する

iOS Swift

この記事を読んでわかること

  • 独自クラスの配列を拡張してメソッドを追加する

独自クラスの配列を拡張してメソッドを追加する

まずは独自クラスのAnimalクラスを作成した。
プロパティにnameを持つだけ。

class Animal:NSObject{
    let name: String
    init(name:String) {
        self.name = name
        super.init()
    }
}

Animalクラスの配列を拡張し、 配列内の全てのオブジェクトのnameプロパティを 出力する printAll() メソッドを追加する。

extension Array where Element: Animal{
    func printAll(){
        for animal in self{
            print(animal.name)
        }
    }
}

ポイントとしては、whereを使ってArrayの要素(Element)が
Animal型であることを指定してあげるくらい。

実際に使ってみる。

class Animal:NSObject{
    let name: String
    init(name:String) {
        self.name = name
        super.init()
    }
}

extension Array where Element: Animal{
    func printAll(){
        for animal in self{
            print(animal.name)
        }
    }
}

let dog = Animal(name: "ぽち")
let cat = Animal(name: "みゃー")
[dog, cat].printAll()

// ぽち
// みやー


参考情報

Swift

iOSアプリ開発未経験の人向け
・Swift初心者の人に評判が良いようですね


・わかりやすくていい、と聞いた本
立ち読みした感じだと【アプリ作成未経験の人向け】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】


②を終えたくらいの知識の方向け
・アプリ開発独学中に2冊めに購入した書籍
プログラミング知識はなくても、若干理解するのに時間がかかる程度で、
読み進められるわかりやすさがある。

iPhoneアプリ開発塾

iPhoneアプリ開発塾


③中級者、上級者向け

詳解 Swift

詳解 Swift

詳解 Swift 改訂版

詳解 Swift 改訂版


【iOS Swift入門 #281】Swift3.0がリリースされて、改めてSwiftを勉強してわかったこと その1

iOS Swift Swift3.0

この記事を読んでわかること

  • Swiftを改めて勉強した、私の気付き

Swift3.0での変更点だけでなく、今まで知らなかったことにも気づけました。

気づいたこと

repeat文

do whileの繰り返し構文でdoに代わって、repeatを使うことになった。 repeat while構文となった。使い方に変更はない。

// sumが100以上になるまで繰り返す
var index = 1
var  sum = 0
repeat{
    sum += index
    index += 1
}while sum < 100

print("\(sum)")

繰り返し構文にラベルを付けることができる

繰り返しがネストしているときに
continue <ラベル>
でラベルが付いている繰り返しに移動することができる。

// 九九の掛け算の結果を表示する
var x = 1
var y = 1

// xLoopというラベルをつける
xLoop: repeat{
    if x > 9{
        break
    }
    
    repeat{
        // yが9を超えたら、xLoopに移動する
        if y > 9{
            y = 1
            x += 1
            continue xLoop
        }
        print("\(x) * \(y) = \(x * y)")  // 1 * 1 = 1 のように表示される
        y += 1
    }while true
}while true

repeat文でなく、for文やwhile文でもラベルを使える。

switch文のcaseでRangeが使える

Swift3.0以前から使えていたかもしれない。

// BMIを計算し、結果を表示する
let weight = 59.0
let height = 168.0 / 100.0

let bmi = weight / (height * height)

switch bmi{
case 0.0..<18.5:
    print("低体重(痩せ型): \(bmi)")
case 18.5..<25.0:
    print("普通体重: \(bmi)")
case 25.0..<DBL_MAX:  // DBL_MAXはdouble型の最大値
    print("肥満: \(bmi)")
default:
    break
}

switch文に与えられた値に処理を加えた結果をcaseで評価する

Swift3.0以前から使えていたかもしれない。

// 年齢から選挙権があるか表示する
let age = 35

switch age{
case let x where x >= 18:
    print("選挙権あり")
default:
    print("選挙権なし")
}

↓のように書くこともできる。

let age = 35
switch age{
case _ where age >= 18:
    print("選挙権あり")
default:
    print("選挙権なし")
}

switch文でタプルを評価できる

// 性別と既婚かを表示

// gender 0:男性 1:女性
// married 0:未婚 1:既婚
let me = (gendar: 0, married: 1)

switch me{
case (0, 0):
    print("男性, 未婚")
case (0, 1):
    print("男性, 既婚")
case (1, 0):
    print("女性, 未婚")
case (1, 1):
    print("女性, 既婚")
default:
    break
}

↓のように評価に必要なければ、_(アンダースコア)で無視できる

// gender 0:男性 1:女性
// married 0:未婚 1:既婚
let me = (gendar: 1, married: 1)

switch me{
case (0, 0):
    print("男性, 未婚")
case (0, 1):
    print("男性, 既婚")
case (_, 0):
    print("女性, 未婚")
case (_, 1):
    print("女性, 既婚")
default:
    break
}

↓のようにwhereで条件もつけられた。

let result = (english:90, math: 30)
switch result{
case (let x, _) where x >= 90:
    print("英語すげえ")
default:
    print("普通")
}


参考情報

Swift

iOSアプリ開発未経験の人向け
・Swift初心者の人に評判が良いようですね


・わかりやすくていい、と聞いた本
立ち読みした感じだと【アプリ作成未経験の人向け】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】


②を終えたくらいの知識の方向け
・アプリ開発独学中に2冊めに購入した書籍
プログラミング知識はなくても、若干理解するのに時間がかかる程度で、
読み進められるわかりやすさがある。

iPhoneアプリ開発塾

iPhoneアプリ開発塾


③中級者、上級者向け

詳解 Swift

詳解 Swift

詳解 Swift 改訂版

詳解 Swift 改訂版


【iOS Swift入門 #280】テーブルビューをスクロールしたときにカクカクするのを無くすためにすること ~カラーブレンド(color blend)処理を無くす~

iOS Swift color blend TableView

この記事を読んでわかること

  • テーブルビューをスクロールしたときにカクカクするのを無くすためにすること

テーブルビューをスクロールしたときにカクカクする原因は、
描画処理に重い処理(複数のことも)が入ることによって発生していることがあります。

今回は原因のひとつとなりうる「カラーブレンド処理」について書きます。

カラーブレンド処理とは何か?

Viewを(半)透明にすると、背後にあるViewの色との合成処理が行われます。
これがカラーブレンド処理です。
Viewが(半)透明でなければ、合成処理が行われないため処理が軽くなります。

カラーブレンド処理が発生しているか確認する

Xcodeに付属するInstrumentsというツールを使用します。
実機をつないでから、Xcodeの上部メニューの「Products」から「Profile」を選択すると起動します。

Core Animationを選択します。
f:id:fjswkun:20160814184557p:plain

右下のところに「Color Blended Layers」があるのでチェックを入れます。
f:id:fjswkun:20160814184605p:plain

繋いでいる実機の画面を見てみます。
f:id:fjswkun:20160814185003p:plain

画面で赤くなっている部分でカラーブレンド処理が発生しています。
これを出来るだけ少なくすることで処理が軽くなります。

カラーブレンド処理を無くすには

透明の処理をなくしていきます。
単純に背景色の透明をなくせばいいというわけではなく、
Viewの種類によって、対応が変わっていきます。

ここではUILabelで試します。
f:id:fjswkun:20160814185003p:plain

UILabelではデフォルトでalphaプロパティが1.0ですが
背景色がclear colorなので透明になっています。
そのため、カラーブレンド処理が発生しています。

まずは背景色を白にします。

しかし、カラーブレンド処理が発生したまま。 f:id:fjswkun:20160814185003p:plain

UILabelはサブビューをもっていて、 サブビューがUILabelの表示枠をはみ出していて、それが影響して、
カラーブレンド処理が残ったままになっていると推測しています。

これを解決するためにclipsToBoundsプロパティをtrueにしました。
するとカラーブレンド処理がなくなりました。
f:id:fjswkun:20160814194120p:plain

カラーブレンド処理が無くならないときには下記プロパティなども確認してみましょう。

  • Viewのopaqueプロパティがtrueになっているか
  • UIImageViewの場合、表示する画像自体に透明の設定がされていないか


参考情報

Swift

iOSアプリ開発未経験の人向け
・Swift初心者の人に評判が良いようですね


・わかりやすくていい、と聞いた本
立ち読みした感じだと【アプリ作成未経験の人向け】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】


②を終えたくらいの知識の方向け
・アプリ開発独学中に2冊めに購入した書籍
プログラミング知識はなくても、若干理解するのに時間がかかる程度で、
読み進められるわかりやすさがある。

iPhoneアプリ開発塾

iPhoneアプリ開発塾


③中級者、上級者向け

詳解 Swift

詳解 Swift

詳解 Swift 改訂版

詳解 Swift 改訂版


【iOS Swift入門 #279】KeyChain(キーチェーン)データの バックアップ・復元可否

iOS Swift KeyChain キーチェーン

はじめに

キーチェーンのデータの設定などにより復元できるかが変わります。

主に下記の2つの内容によって変わってきます。 - バックアップ方法 - 復元端末

調べて、簡単に整理しました。

バックアップ方法

バックアップ方法としては下記のように分けられます。

  • コンピュータにバックアップ
    • バックアップデータを非暗号化
    • バックアップデータを暗号化
  • iCloudバックアップ
    • iCloudのキーチェーン設定をオフ
    • iCloudのキーチェーン設定をオン

コンピュータにバックアップ

コンピュータにバックアップはiTunesでバックアップすることです。
iPhoneのバックアップを暗号化」にチェックを入れることで暗号化してバックアップされます。

f:id:fjswkun:20160806113301p:plain

iCloudバックアップ

iCloudバックアップはiPhone/iPadなどの端末でバックアップします。
iCloudバックアップはiPhone/iPadの下記画面で「バックアップ」でオン・オフできます。
「キーチェーン」をオン・オフすることでキーチェーンのデータをバックアップするか選択できます。

f:id:fjswkun:20160806113309p:plain

復元

復元は下記2種類に分けられます。

  • バックアップした端末と同じ端末に復元する
  • バックアップした端末と別の端末に復元する

復元方法の詳細は省略します。

キーチェーンデータの復元可否

バックアップ方法と復元端末によるキーチェーンデータの 復元可否は以下の通りとなります。

OKが復元可能、NGは復元不可能を表します。

バックアップ方法/復元端末 バックアップした端末 バックアップした端末と別端末
コンピュータにバックアップ(非暗号化) OK NG
コンピュータにバックアップ(暗号化) OK OK
iCloudバックアップ(キーチェーンオフ) OK NG
iCloudバックアップ(キーチェーンオン) OK OK


参考情報

Swift

iOSアプリ開発未経験の人向け
・Swift初心者の人に評判が良いようですね


・わかりやすくていい、と聞いた本
立ち読みした感じだと【アプリ作成未経験の人向け】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】


②を終えたくらいの知識の方向け
・アプリ開発独学中に2冊めに購入した書籍
プログラミング知識はなくても、若干理解するのに時間がかかる程度で、
読み進められるわかりやすさがある。

iPhoneアプリ開発塾

iPhoneアプリ開発塾


③中級者、上級者向け

詳解 Swift

詳解 Swift

詳解 Swift 改訂版

詳解 Swift 改訂版


【iOS Swift入門 #278】ScrollMenu(スクロールメニュー)を作ってみました

iOS Swift carthage ライブラリ

この記事を読んでわかること

  • ScrollMenuの使い方

はじめに

画面の上のほうに横スクロールメニューを作りました。 ニュース系アプリやブログまとめアプリで使われているのを見ますね。

↓のキャプチャのように動きます。

github.com https://cloud.githubusercontent.com/assets/4578511/17367235/25c7e36e-59ca-11e6-988d-765819c878aa.gif

実践編

画像の切替

簡単な例ですが、スクロールメニューを使って、
表示されている画像を切り替えられるようにしてみます。

https://cloud.githubusercontent.com/assets/4578511/17402517/a61451dc-5a8e-11e6-972c-06bd2baabd1e.gif

githubでプロジェクトをダウンロードすることができます。 GitHub - fuji2013/ScrollMenu

  1. 新規プロジェクトを作成します
  2. Carhtageを使って、スクロールメニューのframeworkを追加します。(詳細はGitHub - fuji2013/ScrollMenu)
  3. 表示する画像リソースを追加(001.jpg ~ 003.jpgという名前の画像を追加した)
  4. ViewController.swiftを下記のとおりに編集
import UIKit
import ScrollMenu

class ViewController: UIViewController, ScrollMenuDelegate {
    let images = ["001.jpg", "002.jpg", "003.jpg", "004.jpg"]
    let imageView = UIImageView(frame: CGRectZero)
    let scrollMenu = ScrollMenu(frame: CGRectZero)

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // スクロールメニューの作成
        buildScrollMenu()
        
        // スクロールメニューの位置、サイズ
        scrollMenu.scrollMenuDelegate = self
        scrollMenu.frame = CGRect(x: 0, y: 20.0, width: view.bounds.width, height: 60)
        view.addSubview(scrollMenu)

        // 画像表示の位置、サイズ
        let center = CGPoint(x: view.bounds.width/2, y: view.bounds.height/2)
        let size = CGSize(width: view.bounds.width/2, height: view.bounds.height/2)
        imageView.frame = CGRect(origin: CGPointZero, size: size)
        imageView.center = center
        view.addSubview(imageView)
        
        // 最初のメニューを選択
        scrollMenu.selectIndex(0)
    }
    
    private func buildScrollMenu(){
        let colors = [UIColor.yellowColor(), UIColor.redColor(), UIColor.blueColor(), UIColor.brownColor()]
        for i in 0 ..< images.count{
            let menu = Menu(title: "image\(i)",
                            defaultBarColor: colors[i],
                            selectedBarColor: colors[i],
                            selectedTitleColor: colors[i])
            
            scrollMenu.addMenu(menu)
        }
    }

    func scrollMenuDidSelect(index index: Int) {
        // 画像の切替
        imageView.image = UIImage(named: images[index])
    }
    
    func scrollMenuDidDeselect(index index: Int) {
        // do nothing
    }
}


参考情報

Swift

iOSアプリ開発未経験の人向け
・Swift初心者の人に評判が良いようですね


・わかりやすくていい、と聞いた本
立ち読みした感じだと【アプリ作成未経験の人向け】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】


②を終えたくらいの知識の方向け
・アプリ開発独学中に2冊めに購入した書籍
プログラミング知識はなくても、若干理解するのに時間がかかる程度で、
読み進められるわかりやすさがある。

iPhoneアプリ開発塾

iPhoneアプリ開発塾


③中級者、上級者向け

詳解 Swift

詳解 Swift

詳解 Swift 改訂版

詳解 Swift 改訂版


【iOS Swift入門 #277】「失敗する可能性があるイニシャライザ」を定義する

iOS Swift Swift基本文法 入門

この記事を読んでわかること

  • 失敗する可能性があるイニシャライザ

初期化に失敗させる場合

  • イニシャライザの中で各種プロパティの初期化に失敗した場合

失敗する可能性があるイニシャライザの定義

initではなく、init?でイニシャライザを定義する。 注意すべきは初期化に成功した場合はオプショナル型のオブジェクトが返されること。

class Sales{
    let product:String
    let date:NSDate
    
    init?(product:String, dateString:String){
        self.product = product
        
        let formatter = NSDateFormatter()
        formatter.dateFormat = "yyyyMMdd HH:mm:ss"
        
        // 日付フォーマットに失敗した場合、初期化を失敗させる
        guard let date = formatter.dateFromString(dateString) else{
            return nil
        }
        self.date = date
    }
}

// 初期化に成功
let todaySales = Sales(product: "テレビ", dateString: "20160621 18:19:23")

// 初期化に失敗した場合はnil
let yesterdaySales = Sales(product: "洗濯機", dateString: "2016-06-20 10:23:20")


参考情報

Swift

iOSアプリ開発未経験の人向け
iOSアプリ開発をはじめたとき最初に買った書籍 【アプリ作成未経験の人向け】
Storyboardを使って画面を作成していく。
手順にしたがって操作していくと、ボタンの作成やWebViewの作成などができる。
アプリって、こんな感じで作るんだというのを体験できる。

Swiftではじめる iPhoneアプリ開発の教科書 【iOS 8&Xcode 6対応】

Swiftではじめる iPhoneアプリ開発の教科書 【iOS 8&Xcode 6対応】


・わかりやすくていい、と聞いた本
立ち読みした感じだと【アプリ作成未経験の人向け】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】


②を終えたくらいの知識の方向け
・アプリ開発独学中に2冊めに購入した書籍
プログラミング知識はなくても、若干理解するのに時間がかかる程度で、
読み進められるわかりやすさがある。

iPhoneアプリ開発塾

iPhoneアプリ開発塾


③中級者、上級者向け

詳解 Swift

詳解 Swift

詳解 Swift 改訂版

詳解 Swift 改訂版


【iOS Swift入門 #276】UITabBarの真ん中のボタンを強調表示する方法のサンプル

iOS Swift 入門

この記事を読んでわかること

  • UITabBarの真ん中のボタンを強調表示する方法

はじめに

タブバーの真ん中だけ大きく表示されていたり、
真ん中以外のボタンとは表示が異なるようなデザインを見かける。

例えば、Money Forwardという家計簿アプリでは、 真ん中のボタンを強調して表示するようになってる。 f:id:fjswkun:20160326114401p:plain

どのように実現するのか考えてみた。
方法はいくつもあるのだろうけど、
最もシンプルな方法はUITabBarの上にUIButtonを置く方法です。

下記、その実装を書いてみました。

実装

1. UITabBarControllerのサブクラスを作成します

「BigCenterTabBarController」という名前で作成しました。

import UIKit

class BigCenterTabBarController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

2. UITabBarの真ん中に置くUIButtonを作成します

BigCenterTabBarControllerにUIButtonを作成する処理を書きます

// タブ真ん中のボタン作成
private func setupBigCenterButton(){
    let button = UIButton(type: .Custom)
    button.setBackgroundImage(UIImage(named: "center_button") , forState: .Normal)   // TODO:画像の用意
    button.sizeToFit()
    button.center = CGPoint(x: tabBar.bounds.size.width / 2, y: tabBar.bounds.size.height - (button.bounds.size.height/2))
    button.addTarget(self, action: "tapBigCenter:", forControlEvents: .TouchUpInside)
    tabBar.addSubview(button)
}

// タブ真ん中を選択する
func tapBigCenter(sender:AnyObject){
    selectedIndex = 2;
}

3. 作成したUIButtonを表示する

BigCenterTabBarControllerにUIButtonを作成する処理を書きます
viewDidLayoutSubviewsをオーバーライドして、その中に書きます。
※UITabBarが描画されたあとでないと思った通りの表示になりません。

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    
    // タブ真ん中にボタンを置く
    setupBigCenterButton()
}

上記手順1と2、3を終えた後のBigCenterTabBarController

import UIKit

class BigCenterTabBarController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        
        // タブ真ん中にボタンを置く
        setupBigCenterButton()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    // タブ真ん中のボタン作成
    private func setupBigCenterButton(){
        let button = UIButton(type: .Custom)
        button.setBackgroundImage(UIImage(named: "center_button") , forState: .Normal)   // TODO:画像の用意
        button.sizeToFit()
        button.center = CGPoint(x: tabBar.bounds.size.width / 2, y: tabBar.bounds.size.height - (button.bounds.size.height/2))
        button.addTarget(self, action: "tapBigCenter:", forControlEvents: .TouchUpInside)
        tabBar.addSubview(button)
    }
    
    // タブ真ん中を選択する
    func tapBigCenter(sender:AnyObject){
        selectedIndex = 2;
    }
}

実行

上記手順以外にもStoryboardなどを使って画面を構成する必要があります。
そこは省略します。 詳しくはサンプルを↓に保存していますのでそちらを確認してください。
SampleTab.zip - Google ドライブ 以下サンプルを実行してみます。

1. アプリ起動

f:id:fjswkun:20160326123032p:plain

2. 真ん中のボタンをタップ

f:id:fjswkun:20160326123049p:plain


参考情報

Swift

iOSアプリ開発未経験の人向け
iOSアプリ開発をはじめたとき最初に買った書籍 【アプリ作成未経験の人向け】
Storyboardを使って画面を作成していく。
手順にしたがって操作していくと、ボタンの作成やWebViewの作成などができる。
アプリって、こんな感じで作るんだというのを体験できる。

Swiftではじめる iPhoneアプリ開発の教科書 【iOS 8&Xcode 6対応】

Swiftではじめる iPhoneアプリ開発の教科書 【iOS 8&Xcode 6対応】


・わかりやすくていい、と聞いた本
立ち読みした感じだと【アプリ作成未経験の人向け】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】

絶対に挫折しない iPhoneアプリ開発「超」入門【Swift & iOS8.1以降 完全対応】


②を終えたくらいの知識の方向け
・アプリ開発独学中に2冊めに購入した書籍
プログラミング知識はなくても、若干理解するのに時間がかかる程度で、
読み進められるわかりやすさがある。

iPhoneアプリ開発塾

iPhoneアプリ開発塾


③中級者、上級者向け

詳解 Swift

詳解 Swift

詳解 Swift 改訂版

詳解 Swift 改訂版