開発環境
- OS X Mavericks - Apple(OS)
- Xcode 6.0 Beta
- Swift (プログラミング言語)
Head First C ―頭とからだで覚えるCの基本(David Griffiths (著)、Dawn Griffiths (著) 中田 秀基(監訳)(翻訳)、木下 哲也 (翻訳)、オライリージャパン)の3章(小さなツールの作成: 1つのことだけどうまくやる)、コードマグネット(p.143)をSwiftで考えてみる。
コードマグネット(p.143)
コード(Xcode)
string.swift
//
// string.swift
// string
//
// Created by kamimura on 8/10/14.
// Copyright (c) 2014 kamimura. All rights reserved.
//
import Foundation
extension String {
var swapcaseString:String {
var result: String = ""
for ch in self {
let s = String(ch)
result += s.uppercaseString == s ? s.lowercaseString : s.uppercaseString
}
return result
}
var isUpper:Bool { return self.uppercaseString == self }
var isLower:Bool { return self.lowercaseString == self }
var length:Int { return (self as NSString).length }
var strip:String { return self.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())}
var floatValue:Float { return (self as NSString).floatValue }
var doubleValue:Double { return (self as NSString).doubleValue }
func count(sub:String) -> Int {
var result:Int = 0
var s = self
let index:String.Index = "a".endIndex
while s != "" {
if s.hasPrefix(sub) {
result += 1
s = s.substringFromIndex(sub.endIndex)
} else {
s = s.substringFromIndex(index)
}
}
return result
}
func find(sub:String, start:Int = 0, end:Int? = nil) -> Int {
var s = self as NSString
var s_temp = s.substringFromIndex(start)
let end_temp:Int = end ? end! : s.length
for i in start..<end_temp {
if (s_temp.hasPrefix(sub)) {
return i
}
s_temp = s.substringFromIndex(i + 1) as NSString
}
return -1
}
func replace(old_str:String, new_str:String) -> String {
return self.stringByReplacingOccurrencesOfString(old_str, withString: new_str)
}
func slice(start:Int=0, end:Int?=nil) -> String {
let s = self as NSString
var new_end:Int
if (end) {
new_end = end!
} else {
new_end = s.length
}
return s.substringWithRange(NSRange(location: start, length:new_end - start))
}
func split(sep:String = "") -> [String] {
var result:[String] = []
if (sep == "") {
for ch in self {
result.append(String(ch))
}
return result
}
var s:String = self
var len = sep.length
var temp:String = ""
while s != "" {
if s.hasPrefix(sep) {
if temp != "" {
result.append(temp)
temp = ""
}
s = s.slice(start: len)
} else {
temp += s.slice(start: 0, end: 1)
s = s.slice(start: 1)
}
}
if temp != "" {
result.append(temp)
}
return result
}
var reversed:String { return "".join(self.split().reverse()) }
}
stdio.swift
//
// stdio.swift
// stdio
//
// Created by kamimura on 8/21/14.
// Copyright (c) 2014 kamimura. All rights reserved.
//
import Foundation
// 標準入力(STDIN)から読み込む
func input(msg:String = "") -> String {
print(msg)
var in_fh = NSFileHandle.fileHandleWithStandardInput()
var data = in_fh.availableData
var s = NSString(data: data, encoding: NSUTF8StringEncoding)
s = s.substringToIndex(s.length - 1)
return s
}
func read(path:String) -> String? {
return String.stringWithContentsOfFile(path)
}
func print(s:String, path:String, end:String = "\n") {
(s + end).writeToFile(path, atomically: true, encoding: NSUTF8StringEncoding, error: nil)
}
func error(msg:String) {
let stderr = NSFileHandle.fileHandleWithStandardError()
stderr.writeData((msg + "\n").dataUsingEncoding(NSUTF8StringEncoding))
exit(1)
}
// コマンドライン引数
let argv:[String] = NSProcessInfo.processInfo().arguments.map({(x:AnyObject) -> String in x as String})
main.swift
//
// main.swift
// categorize
//
// Created by kamimura on 8/21/14.
// Copyright (c) 2014 kamimura. All rights reserved.
//
import Foundation
if argv.count != 6 {
error("5つの引数を指定してください。")
}
let in_s:String? = read("spooky.csv")
if in_s == nil {
error("spooky.csvファイルを読み込めませんでした。")
}
var result1 = ""
var result2 = ""
var result3 = ""
for line in in_s!.split(sep: "\n") {
var new_line = line.strip
if new_line.find(argv[1]) != -1 {
result1 += new_line + "\n"
} else if new_line.find(argv[3]) != -1 {
result2 += new_line + "\n"
} else {
result3 += new_line + "\n"
}
}
print(result1, argv[2], end: "")
print(result2, argv[4], end: "")
print(result3, argv[5], end: "")
入出力結果(Console Output, Terminal)
$ ./categorize 5つの引数を指定してください。 $ ./categorize mermaid mermaid.csv Elvis elvises.csv the_rest.csv $ cat spooky.csv 30.685163,-68.137207,Type=Yeti -100.0, 50,Type=Test1 28.304380,-74.575195,Type=UFO 29.132971,-71.136475,Type=Ship 28.343065,-62.753906,Type=Elvis 27.868217,-68.005371,Type=Goatsucker 30.496017,-73.333740,Type=Disappearance 26.224447,-71.477051,Type=UFO 29.401320,-66.027832,Type=Ship 37.879536,-69.477539,Type=Elvis 22.705256,-68.192139,Type=Elvis 27.166695,-87.484131,Type=Elvis 50,200,Type=Test2 $ cat mermaid.csv $ cat elvises.csv 28.343065,-62.753906,Type=Elvis 37.879536,-69.477539,Type=Elvis 22.705256,-68.192139,Type=Elvis 27.166695,-87.484131,Type=Elvis $ cat the_rest.csv 30.685163,-68.137207,Type=Yeti -100.0, 50,Type=Test1 28.304380,-74.575195,Type=UFO 29.132971,-71.136475,Type=Ship 27.868217,-68.005371,Type=Goatsucker 30.496017,-73.333740,Type=Disappearance 26.224447,-71.477051,Type=UFO 29.401320,-66.027832,Type=Ship 50,200,Type=Test2 $
0 コメント:
コメントを投稿