PHP 프로그래머의 Swift 언어 시작

개요


평소에는 PHP 프로그래머로 앞으로 iOS 앱을 개발하고 싶은 사람들을 대상으로 Swift 언어의 기본을 정리한다.

작업 환경


OS X El Capitan 10.11.4
Xcode7.3(2016년 5월 최신 버전, Swift2.2 지원)
Xcode는 App Store 버전일 수 있지만 dmg 버전을 추천합니다(이하 URL에서 다운로드).
https://developer.apple.com/downloads/
참고 자료
여러 버전의 Xcode를 추가하는 방법 및 각 Xcode에 대응하는 Swift 버전 요약

문법 공부


Get started with a playground 클릭

번역 없이 바로 동작을 확인할 수 있습니다.

문장 끝 번호 필요 없어요.


PHP
echo 'test';
Swift
print("test")

문자열은 작은 따옴표를 사용할 수 없기 때문에 이중 따옴표로 쓴다


PHP
echo 'test';
Swift
print("test")

성명 상수


PHP
//クラス外定数の場合
define('INDEX_NUMBER', 1);

//クラス内定数の場合
const INDEX_NUMBER = 1;
Swift
//let 定数名:型名(IntやStringなど) = 値

let n:Int = 100
let str:String = "hello"

//型名省略可能
let n = 100
let str = "hello"

//出力する場合
print(n) //100
print(str) //hello

변수 선언


PHP
//クラス外変数
$a = 1;

//クラス内変数
private $number;
Swift
//var 定数名:型名(IntやStringやBoolなど) = 値

var n:Int = 100
var str:String = "hello"
var result:Bool = true

//型名省略可能
var n = 100
var str = "hello"
var result = true

//出力する場合
print(n) //100
print(str) //hello
print(result) //true

포함 변수


PHP
$str = 'world';
echo "hello $str"; //hello world
Swift
//バックスラッシュ(変数)

var str = "world"
print("hello \(str)") //hello world

증분 및 감량


PHP
$n = 0;
$n++; //インクリメント
$n--; //デクリメント
echo $n; //0
Swift
var n = 0
n += 1 //インクリメント(++演算子はSwift3系から使えなくなるのでこのような書き方になる)
n -= 1 //デクリメント(--演算子はSwift3系から使えなくなるのでこのような書き方になる)
print(n) //0

빈 값과nil


PHP
$var = null;
var_dump($var); //NULL
Swift
var str:String? = nil //型名にクエスチョンマークをつけることでnilの代入が可能となる
print(str) //nil

반복 처리


PHP
for ($i=0; $i<10; $i++) {
    echo "test\n";
}
Swift
//for 変数 in レンジや配列や辞書
for i in 1...10 {
    print("test \(i)")
}

//for 変数を使わない場合はアンダースコア in レンジや配列や辞書
for _ in 1...10 {
    print("test")
}

수조 상수 및 수조 변수의 성명


PHP
$numberArray = array(11,22,33);
$strArray = array("test","hello","world");
Swift
//配列定数
let number:[Int] = [11,22,33]
//配列変数
var str:[String] = ["test","hello","world"]

배열 초기화


PHP
//配列の初期化
$numberArray = array();
//初期化された配列に値を代入
$numberArray = array(11,22,33);
Swift
//配列の初期化
var number = [Int]()
//初期化された配列に値を代入
number = [11,22,33]

배열 요소 추출


PHP
$numberArray = array(11,22,33);

foreach ($numberArray as $number) {
    echo "$number\n";
}
Swift
var number:[Int] = [11,22,33]
for i in number {
    print(i)
}

사전 상수 및 사전 변수의 성명


PHP
$numberArray = array("aaa"=>11,
                     "bbb"=>22,
                     "ccc"=>33
               );
Swift
//辞書定数
let number:[String:Int] = ["aaa":11,"bbb":22,"ccc":33]
//辞書変数
var number:[String:Int] = ["aaa":11,"bbb":22,"ccc":33]

사전 초기화


PHP
$numberArray = array();
$numberArray = array("aaa"=>11,
                     "bbb"=>22,
                     "ccc"=>33
               );
Swift
var number = [String:Int]()
number = ["aaa":11,"bbb":22,"ccc":33]

사전 요소 추출


PHP
$numberArray = array("aaa"=>11,
                     "bbb"=>22,
                     "ccc"=>33
               );

foreach ($numberArray as $str => $number) {
    echo "$str $number\n";
}
Swift
var number:[String:Int] = ["aaa":11,"bbb":22,"ccc":33]

for (key,value) in number {
    print("\(key) \(value)")
}

Swift 패키지 및 확장 옵션


Swift
var str:String? = "hello" //型名に?をつけてオプショナル型にラップする
print(str)  //Optional("hello")
print(str!) //hello 変数の最後に!をつけてアンラップする

Swift 사전 값은 선택 사항입니다.


Swift
var number:[String:Int] = ["aaa":11,"bbb":22,"ccc":33]
print(number["aaa"])  //Optional(11)
print(number["aaa"]!) //11 エクスクラメーションをつけてアンラップして取り出す

선택 가능한 수조로 nil의 가능한 데이터를 저장합니다. (또한 사전에서 nil의 값은 무시되기 때문에 저장할 수 없습니다.)


Swift
var array:[String?] = ["hello",nil,"world"]

for i in array {
    print(i)
}

//Optional("hello")
//nil
//Optional("world")

정수 변환


Swift
let str = "123"  //String型
let n = Int(str) //失敗した場合はnilが返却される(型名?は省略可能)
print(n)  //Optional(123) 失敗した場合nil返却なのでオプショナル型が返却される
print(n!) //123

옵션 귀속(optional형nil 판정)


Swift
var array:[String?] = ["123",nil,"789"]

for data in array {
    if let d = data { //nilならfalse、nilではないならアンラップされた値を代入
        print(d.dynamicType) //String アンラップされていることがわかる
        print("\(Int(d)!) \(Int(d)!.dynamicType)") //123 Int,789 Int
    } else {
        //nilのときの処理
    }
}

메타그룹(여러 가지 유형의 값을 한데 묶음)


Swift
var tp = (name:"Kentaro Yamada", age:20)
print(tp.name)
print(tp.age)

enum (때때로 마술 번호를 방지하기 위해 enum을 사용)


Swift
enum OS:String {
    case Windows = "Windows"
    case iOS     = "iOS"
    case Android = "Android"
}

print(OS.Windows) //OS.Windowsの処理を書く(enumはSwitch分岐との相性が良い)
print(OS.Windows.rawValue) //デフォルトの値を持たせることができる

함수


Swift
//戻り値なし
func hello(str:String) {
    print(str)
}
hello("hello") //hello


//戻り値あり
func world(str:String) -> String {
    return str
}
var str = world("world")
print(str) //world


//複数の戻り値
func helloWorld(name:String) -> (name:String, age:Int) {
    let age = 12
    return (name,age)
}
var ret = helloWorld("Kentaro Yamada")
print(ret.name) //Kentaro Yamada
print(ret.age)  //12

//複数の引数
func helloWorld2(name:String, age:Int) -> (name2:String, age2:Int) {
    return (name,age)
}
var ret2 = helloWorld2("Kentaro Yamada",age:12) //第2引数には引数名をつける必要有
print(ret2.name2) //Kentaro Yamada
print(ret2.age2)  //12

//複数の引数(外部名あり)
func helloWorld2(n name:String,a age:Int) -> (name2:String, age2:Int) {
    return (name,age)
}
var ret2 = helloWorld2(n:"Kentaro Yamada", a:12)
print(ret2.name2) //Kentaro Yamada
print(ret2.age2)  //12

기본 엔클로저


Swift
func fc(n:Int) -> Int {
    return n * 2
}

func clsr(f:(Int)->Int, n:Int) {
    print(f(n))
}
clsr(fc,n:10) //20

기본 클래스


Swift
class MyData {

    var name:String = ""

    func hello(){
        print("hello \(name)")
    }
}

var obj = MyData()
obj.name = "Kentaro Yamada"
obj.hello() //hello Kentaro Yamada

편의점 초기화기


Swift
class Test {

    var name:String = ""
    var age:Int = 0

    //指定イニシャライザ
    init(name:String, age:Int) {
        self.name = name
        self.age  = age
    }

    convenience init () {
        self.init(name:"noname", age:0)
    }

    convenience init (name:String) {
        self.init(name:name, age:0)
    }

    func hello(){
        print("\(name) \(age)")
    }
}

var test = Test(name:"Kentaro Yamada", age:20)
test.hello()  //Kentaro Yamada 20

var test2 = Test(name:"Kentaro Yamada")
test2.hello() //Kentaro Yamada 0

var test3 = Test()
test3.hello() //noname 0

계산된 속성


Swift

class Test {

    private var name:String = ""
    private var age:Int = 0

    //Computedプロパティ
    var getName:String {
        get {
            return self.name
        }
        set {
            self.name = newValue
        }
    }

    init(name:String, age:Int) {
         self.name = name
        self.age  = age
    }
    func hello(){
        print("\(name) \(age)")
    }
}

var test = Test(name:"Kentaro Yamada", age:20)
test.hello()  //Kentaro Yamada 20
print(test.getName) //Kentaro Yamada
test.getName = "aaa"
print(test.getName) //aaa

속성 관찰기


Swift
class Test {

    //プロパティオブザーバー(書き換えの前後を監視する)
    var name:String = "" {
        willSet(name){
            print("willSet \(name)")
        }
        didSet {
            print("didSet \(name)")
        }
    }
    var age:Int = 0

    init(name:String, age:Int) {
         self.name = name
        self.age  = age
    }
    func hello(){
        print("\(name) \(age)")
    }
}

var test = Test(name:"Kentaro Yamada", age:20)
test.hello()  //Kentaro Yamada 20
test.name = "hello"
print(test.name) //hello
test.hello() //hello 20

좋은 웹페이지 즐겨찾기