【Swift4】【Codable】 CodingKeys書くのだるいよね

とゆーわけで作りました。SwiftLint対応。

SOURCE_DIR="$PROJECT_DIR/Hoge/Models"
DEST_DIR="$PROJECT_DIR/Hoge/ModelExtensions"

find $DEST_DIR -name "*Ex.swift" -type f | while read FILE
do
    rm -f ${FILE}
done

find $SOURCE_DIR -name "*.swift" -type f | while read FILE
do
    NAME=$(basename ${FILE} | sed "s/.swift//g")
    DEST_FILE=$DEST_DIR"/"$NAME"Ex.swift"
    touch $DEST_FILE
    echo "extension $NAME {" >> "$DEST_FILE"
    echo "    enum CodingKeys: String, CodingKey {" >> "$DEST_FILE"

    while read line; do
	if ! echo $line | grep -q //; then
	if echo $line | grep -q let; then
            NAME=$(echo $line | sed -e "s/:.*$//g" -e "s/^.*let //g")
            SNAKED=$(echo $NAME | gsed -r -e 's/^([A-Z])/\L\1\E/' -e 's/([A-Z])/_\L\1\E/g')
            if [ $NAME = $SNAKED ]; then
	        echo "        case $NAME" >> "$DEST_FILE"
	    else
	        echo "        case $NAME = "'"'"$SNAKED"'"' >> "$DEST_FILE"
	    fi
        fi
        fi
    done < ${FILE}

    echo "    }" >> "$DEST_FILE"
    echo "}" >> "$DEST_FILE"
done





おひさしぶり

今に始まったことじゃないけど、ここ最近のフリーランスageについて思うこと

わたくし
.NET系はだいたい何でもできて
iOSObjective-cもSwiftもできて。なんならARCなしで書いてたし
AndroidJavaもKotlinもできて。なんなら2.3くらいから書いてたし
WebはC#PHPRubyもできて、フロントエンドも人並みにはできて
DBはSQLServerMySQLpostgreSQLできて
AWSもできて
Unityもできて
toCtoBも業務システムもカジュアルゲームもソシャゲも3Dゲームも作れて
大手メーカーのもの作ってたから全世界に出荷されてるし
某キャリアのスマホユーザーはだいたい俺が作ったの使ったことあるはずだし
上場企業に新卒で入って
10億規模の有名ゲームのチーフエンジニアやってたし
フリーランスもやってたし
ベンチャーのCTO兼Co-Founderやってたし
有名ベンチャーの開発責任者もやってたし
有名ベンチャーのアドバイザーもやってるし
いまだにちょこちょこCTOの話とかはもらうし
経営実務は完璧にこなせるし
たぶん総務部長とかできるくらいには総務詳しいし
労働基準法とか法令関連もめっちゃ勉強したし
何年間も年数千万以上は契約取れ続けるくらいには営業できるし
もうすぐ三期目終えられそうなくらいにはちゃんと会社続けられてるけど
採用とマネジメントだけは苦手だけど


それでも
やはりIoTかVRか仮想通貨かAIかVUIかに手を出さなきゃかなとか
React Nativeやろうかとか
Unreal Engineやろうかとか
PhysonとGoとRやらなきゃとか
スモールビジネスじゃなくてスタートアップの経営もやっといたほうがいいかなとか
資金調達ってしたことないからしてみたほうがいいかなとか
日本だけでやってたらやばいんじゃないかとか
ものすごいめっちゃ不安ですよ。まじで。



会社員に戻っても絶対年収1000万は切らない自信はあるけど、いつ仕事がなくなるか怖くて不安でたまらんのが経営。
会社員よりマシとかいってフリーランスになる人見るとある意味尊敬する。
有給はあるし、福利厚生はあるし、残業代は出るし、会社から金もらって勉強できるし、まじで最高の身分だと思いますよ。はい。
ちなみに経営者側から見ると元フリーランスとか元経営者はあまり採用したくない。
これは人によるかもだけど。ぼくでも相手によるけど。


【iOS,Swift3】Extension晒す〜番外編〜Propertiesの巻

表題の通りです。ご査収ください。

import Foundation

public protocol Properties {
    
    func properties() -> [String: Any?]
}

extension Properties {
    
    public func properties() -> [String: Any?] {
        var dic = [String: Any?]()
        Mirror(reflecting: self).superclassMirror?.children.forEach { (child) in
            if let key = child.label {
                dic[key] = child.value
            }
        }
        Mirror(reflecting: self).children.forEach { (child) in
            if let key = child.label {
                dic[key] = child.value
            }
        }
        return dic
    }
}

補足。こんな感じで使います。


internal class Hoge: Properties {

    internal var printProperties {
        properties().forEach { (key, value) in
            print("PropertyName: \(key) \nValue:\(String(describing: value))")
        }
    }
}





【iOS,Swift3】Extension晒す〜Date編〜

表題の通りです。ご査収ください。

import Foundation

extension Date {
    
    // MARK: - public property
    
    /// 週あたりの日数
    public var daysPerWeek: Int {
        get {
            return 7
        }
    }
    
    /// 月の初めの日
    public var firstDateOfMonth: Date {
        get {
            let calendar = NSCalendar.current
            var components = calendar.dateComponents([.year, .month, .day], from: self)
            components.day = 1;
            return calendar.date(from: components)!
        }
    }
    
    /// 月の週数
    public var numberOfWeeksForMonth: Int {
        get {
            let rangeOfWeeks = NSCalendar.current.range(of: Calendar.Component.weekOfMonth,
                                                        in: Calendar.Component.month,
                                                        for: firstDateOfMonth)
            return (rangeOfWeeks?.count)!
        }
    }
    
    /// 月の日数
    public var numberOfDaysForMonth: Int {
        get {
            let rangeOfDays = NSCalendar.current.range(of: Calendar.Component.day,
                                                       in: Calendar.Component.month,
                                                       for: firstDateOfMonth)
            return (rangeOfDays?.count)!
        }
    }

    // MARK: - public method

    /// toString()
    ///
    /// - Parameter format: フォーマット
    /// - Parameter calendarIdntifier: カレンダーIdentifier
    /// - Returns: 文字列
    public func toString(format: String, calendarIdentifier: Calendar.Identifier = .gregorian) -> String {
        let formatter = DateFormatter()
        formatter.calendar = Calendar(identifier: calendarIdentifier)
        formatter.dateFormat = format
        return formatter.string(from: self)
    }
    
    /// fromString()
    ///
    /// - Parameters:
    ///   - string: 文字列
    ///   - format: フォーマット
    /// - Parameter calendarIdntifier: カレンダーIdentifier
    /// - Returns: Date
    public static func fromString(_ string: String, format: String, calendarIdentifier: Calendar.Identifier = .gregorian) -> Date? {
        let formatter = DateFormatter()
        formatter.calendar = Calendar(identifier: calendarIdentifier)
        formatter.dateFormat = format
        return formatter.date(from: string)
    }
}





【iOS,Swift3】Extension晒す〜Array編〜

Androidエンジニアと見せかけて、
iOSエンジニア風を装って、
Unityエンジニアのふりして、
インフラエンジニアもちょっと名乗って、
当たり前のようにWebエンジニアとして仕事もするけど、
本業は未だに.NETエンジニアと思いたいけどたぶんもう無理で、
実際の身分はCEOとプレCTOとアプリ開発責任者の伊豆丸さんです。

表題の通りです。ご査収ください。


import Foundation

extension Array where Element: Hashable, Element: Equatable {
    
    public func diff(_ other: [Element]) -> [Element] {
        let all = self + other
        var counter: [Element: Int] = [:]
        all.forEach { counter[$0] = (counter[$0] ?? 0) + 1 }
        return all.filter { (counter[$0] ?? 0) == 1 }
    }
    
    public func subtracting(_ other: [Element]) -> [Element] {
        return self.flatMap { element in
            if (other.filter { $0 == element }).count == 0 {
                return element
            } else {
                return nil
            }
        }
    }
    
    public mutating func subtract(_ other: [Element]) {
        self = subtracting(other)
    }
}





【iOS】URLからUIImageViewに画像表示 Swift3版

タイトルまんま
まともにちゃんと書いてあるのがなかったので

extension UIImageView {    
    public func setImage(fromUrl url: String) {
        URLSession.shared.dataTask(with: URLRequest(url: URL(string: url)!)) { (data, response, error) in
            guard let data = data, let _ = response, error == nil else {
                return
            }
            DispatchQueue.main.async(execute: {
                self.image = UIImage(data: data)
            })
        }.resume()
    }
}





f:id:devdevdev:20170403122736j:plain

花の香りがそよ風に運ばれてくる候となりました。
皆様、いかがお過ごしでしょうか。

って言いたかっただけ。
ネタがない。
うーん。
今まで書いた技術ネタもちょっと古くなってきたからか、ちょっとアクセス少ないし。
うーん。
書きたいことは山ほどあるんですが!書けるネタが!ない!
うーん。

春爛漫のこの頃、健やかなる日々をお過ごしください。