@Objective_C
@フォロワー #1
[iOS]バックグラウンドでAudio再生方法について @Objective_C @iOS @swift
Lubo @回答 • 2014-12-09 15:05 • @フォロワー #3 • 2 回答 • 3752 Views
Objective-CとSwift比較について @swift @Objective_C
iQi @回答 • 2014-06-10 13:48 • @フォロワー #2 • 1 回答 • 1998 Views
0
Swiftの場合:
{{{
var audioSession: AVAudioSession = AVAudioSession.sharedInstance()
audioSession.setCategory(AVAudioSessionCategoryPl...
Swiftの場合:
{{{
var audioSession: AVAudioSession = AVAudioSession.sharedInstance()
audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord, error: nil)
audioSession.setActive(true, error: nil)
}}}
Objective-Cの場合:
{{{
AVAudioSession* session = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayback error:&error];
[audioSession setActive:YES error:nil];
}}}
>>>import AVFoundation
{{{
var audioSession: AVAudioSession = AVAudioSession.sharedInstance()
audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord, error: nil)
audioSession.setActive(true, error: nil)
}}}
Objective-Cの場合:
{{{
AVAudioSession* session = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayback error:&error];
[audioSession setActive:YES error:nil];
}}}
>>>import AVFoundation
0
###UIView
@Objective-c
{{{
UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
v.backgroundColor = [UIColor col...
###UIView
@Objective-c
{{{
UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
v.backgroundColor = [UIColor colorWithRed:1.0f green:1.0 blue:0.0 alpha:1.0f];
[self.view addSubview:v];
}}}
@Swift
{{{
let v:UIView = UIView(frame:CGRectMake(0, 0, 100, 100));
v.backgroundColor = UIColor(red: 1.0, green: 1.0, blue: 0.0, alpha: 1.0);
self.view.addSubview(v);
}}}
###UIImage
@Objective-c
{{{
UIImage *img = [UIImage imageNamed:@"img.png"];
}}}
@Swift
{{{
let img:UIImage = UIImage(named:"img.png");
}}}
###UIImageView
@Objective-c
{{{
UIImageView *iv = [[UIImageView alloc] initWithImage:img];
iv.frame = CGRectMake(0, 0, 100, 100);
[self.view addSubview:iv];
@Swift
let iv:UIImageView = UIImageView(image:img);
iv.frame = CGRectMake(0, 0, 100, 100);
self.view.addSubview(iv);
}}}
###アニメーション
@Objective-c
{{{
[UIView animateWithDuration:1.0f
delay:0.0f
options:UIViewAnimationOptionCurveEaseIn
animations:^(void){
iv.frame = CGRectMake(200, 0, 100, 100);
iv.transform = CGAffineTransformScale(iv.transform, 0.5, 0.5);
iv.alpha = 0.5;
}
completion:^(BOOL finished){
NSLog(@"Animation End");
}];
}}}
@Swift
{{{
UIView.animateWithDuration(
1.0,
delay: 0.0,
options: UIViewAnimationOptions.CurveEaseIn,
animations: {
iv.frame = CGRectMake(200, 0, 100, 100);
iv.transform = CGAffineTransformScale(iv.transform, 0.5, 0.5);
iv.alpha = 0.5;
},
completion:{
(value: Bool) in
println("Animation End");
}
);
}}}
###UIButton
@Objective-c
{{{
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.frame = CGRectMake(100, 0, 100, 100);
[btn setImage:img forState:UIControlStateNormal];
[btn addTarget:self action:@selector(onClick:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
}}}
@Swift
{{{
let btn:UIButton? = UIButton.buttonWithType(UIButtonType.Custom) as? UIButton;
btn!.frame = CGRectMake(100, 0, 100, 100);
btn!.setImage(img, forState: UIControlState.Normal);
btn!.addTarget(self, action: "onClick:", forControlEvents: UIControlEvents.TouchUpInside);
self.view.addSubview(btn);
}}}
###NSString
@Objective-c
{{{
NSString *str0 = @"文字列";
NSString *str1 = [NSString stringWithFormat:@"文字列%d", 1];
}}}
@Swift
{{{
let str0:String! = "文字列";
let str1:String! = NSString(format:"文字列%d", 1)
}}}
###NSLog
@Objective-c
{{{
NSLog(@"%@ : %@", str0, str1);
}}}
@Swift
{{{
NSLog("%@ : %@", str0, str1);
println("\(str0) : \(str1)");
}}}
###NSArray
@Objective-c
{{{
NSArray *arr0 = [NSArray arrayWithObjects:@"0", @"1", @"2", nil];
for(NSString *v in arr0){
NSLog(@"%@", v);
}
}}}
@Swift
{{{
let arr0:String[] = ["0", "1", "2"];
arr0[0] = "00"; // 差し替えは可能
// arr0 += ["3", "4"]; // 追加は不可
// arr0.insert("insert", atIndex:1); // 差し込みは不可
for v in arr0{
println("\(v)");
}
}}}
###NSMutableArray
@Objective-c
{{{
NSMutableArray *arr1 = [NSMutableArray arrayWithObjects:@"0", @"1", @"2", nil];
[arr1 replaceObjectAtIndex:0 withObject:@"00"]; // 差し替え
[arr1 addObject:@"3"]; // 追加
[arr1 addObject:@"4"]; // 追加
[arr1 addObject:@"5"]; // 追加
[arr1 insertObject:@"insert" atIndex:1]; // 差し込み
for(NSString *v in arr1){
NSLog(@"%@", v);
}
}}}
@Swift
{{{
var arr1:String[] = ["0", "1", "2"];
arr1[0] = "00"; // 差し替え
arr1 += ["3", "4"]; // 追加
arr1.append("5"); // 追加
arr1.insert("insert", atIndex:1); // 差し込み
for v in arr1{
println("\(v)");
}
}}}
###NSDictionary
@Objective-c
{{{
NSDictionary *dict0 = [NSDictionary dictionaryWithObjectsAndKeys:@"value0", @"key0", @"value1", @"key1", nil];
for(NSString *key in [dict0 allKeys]){
NSLog(@"%@, %@", key, [dict0 objectForKey:key]);
}
}}}
@Swift
{{{{
let dict0:Dictionary<String, String> = ["key0" : "value0", "key1" : "value1"];
//dict0["key0"] = "mod_value0"; // 差し替えは不可
//dict0["key2"] = "value2"; // 追加は不可
//dict0.removeValueForKey("key1"); 削除は不可
for key in dict0.keys{
println("\(key) : \(dict0[key])");
}
}}}
###NSMutableDictionary
@Objective-c
{{{
NSMutableDictionary *dict1 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"value0", @"key0", @"value1", @"key1", nil];
[dict1 setObject:@"mod_value0" forKey:@"key0"]; // 差し替え
[dict1 setObject:@"value2" forKey:@"key2"]; // 追加
[dict1 removeObjectForKey:@"key1"]; // 削除
for(NSString *key in [dict1 allKeys]){
NSLog(@"%@, %@", key, [dict1 objectForKey:key]);
}
}}}
@Swift
{{{
var dict1:Dictionary<String, String> = ["key0" : "value0", "key1" : "value1"];
dict1["key0"] = "mod_value0"; // 差し替え
dict1["key2"] = "value2"; // 追加
dict1.removeValueForKey("key1"); // 削除
for key in dict1.keys{
println("\(key) : \(dict1[key])");
}
}}}
@Objective-c
{{{
UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
v.backgroundColor = [UIColor colorWithRed:1.0f green:1.0 blue:0.0 alpha:1.0f];
[self.view addSubview:v];
}}}
@Swift
{{{
let v:UIView = UIView(frame:CGRectMake(0, 0, 100, 100));
v.backgroundColor = UIColor(red: 1.0, green: 1.0, blue: 0.0, alpha: 1.0);
self.view.addSubview(v);
}}}
###UIImage
@Objective-c
{{{
UIImage *img = [UIImage imageNamed:@"img.png"];
}}}
@Swift
{{{
let img:UIImage = UIImage(named:"img.png");
}}}
###UIImageView
@Objective-c
{{{
UIImageView *iv = [[UIImageView alloc] initWithImage:img];
iv.frame = CGRectMake(0, 0, 100, 100);
[self.view addSubview:iv];
@Swift
let iv:UIImageView = UIImageView(image:img);
iv.frame = CGRectMake(0, 0, 100, 100);
self.view.addSubview(iv);
}}}
###アニメーション
@Objective-c
{{{
[UIView animateWithDuration:1.0f
delay:0.0f
options:UIViewAnimationOptionCurveEaseIn
animations:^(void){
iv.frame = CGRectMake(200, 0, 100, 100);
iv.transform = CGAffineTransformScale(iv.transform, 0.5, 0.5);
iv.alpha = 0.5;
}
completion:^(BOOL finished){
NSLog(@"Animation End");
}];
}}}
@Swift
{{{
UIView.animateWithDuration(
1.0,
delay: 0.0,
options: UIViewAnimationOptions.CurveEaseIn,
animations: {
iv.frame = CGRectMake(200, 0, 100, 100);
iv.transform = CGAffineTransformScale(iv.transform, 0.5, 0.5);
iv.alpha = 0.5;
},
completion:{
(value: Bool) in
println("Animation End");
}
);
}}}
###UIButton
@Objective-c
{{{
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.frame = CGRectMake(100, 0, 100, 100);
[btn setImage:img forState:UIControlStateNormal];
[btn addTarget:self action:@selector(onClick:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
}}}
@Swift
{{{
let btn:UIButton? = UIButton.buttonWithType(UIButtonType.Custom) as? UIButton;
btn!.frame = CGRectMake(100, 0, 100, 100);
btn!.setImage(img, forState: UIControlState.Normal);
btn!.addTarget(self, action: "onClick:", forControlEvents: UIControlEvents.TouchUpInside);
self.view.addSubview(btn);
}}}
###NSString
@Objective-c
{{{
NSString *str0 = @"文字列";
NSString *str1 = [NSString stringWithFormat:@"文字列%d", 1];
}}}
@Swift
{{{
let str0:String! = "文字列";
let str1:String! = NSString(format:"文字列%d", 1)
}}}
###NSLog
@Objective-c
{{{
NSLog(@"%@ : %@", str0, str1);
}}}
@Swift
{{{
NSLog("%@ : %@", str0, str1);
println("\(str0) : \(str1)");
}}}
###NSArray
@Objective-c
{{{
NSArray *arr0 = [NSArray arrayWithObjects:@"0", @"1", @"2", nil];
for(NSString *v in arr0){
NSLog(@"%@", v);
}
}}}
@Swift
{{{
let arr0:String[] = ["0", "1", "2"];
arr0[0] = "00"; // 差し替えは可能
// arr0 += ["3", "4"]; // 追加は不可
// arr0.insert("insert", atIndex:1); // 差し込みは不可
for v in arr0{
println("\(v)");
}
}}}
###NSMutableArray
@Objective-c
{{{
NSMutableArray *arr1 = [NSMutableArray arrayWithObjects:@"0", @"1", @"2", nil];
[arr1 replaceObjectAtIndex:0 withObject:@"00"]; // 差し替え
[arr1 addObject:@"3"]; // 追加
[arr1 addObject:@"4"]; // 追加
[arr1 addObject:@"5"]; // 追加
[arr1 insertObject:@"insert" atIndex:1]; // 差し込み
for(NSString *v in arr1){
NSLog(@"%@", v);
}
}}}
@Swift
{{{
var arr1:String[] = ["0", "1", "2"];
arr1[0] = "00"; // 差し替え
arr1 += ["3", "4"]; // 追加
arr1.append("5"); // 追加
arr1.insert("insert", atIndex:1); // 差し込み
for v in arr1{
println("\(v)");
}
}}}
###NSDictionary
@Objective-c
{{{
NSDictionary *dict0 = [NSDictionary dictionaryWithObjectsAndKeys:@"value0", @"key0", @"value1", @"key1", nil];
for(NSString *key in [dict0 allKeys]){
NSLog(@"%@, %@", key, [dict0 objectForKey:key]);
}
}}}
@Swift
{{{{
let dict0:Dictionary<String, String> = ["key0" : "value0", "key1" : "value1"];
//dict0["key0"] = "mod_value0"; // 差し替えは不可
//dict0["key2"] = "value2"; // 追加は不可
//dict0.removeValueForKey("key1"); 削除は不可
for key in dict0.keys{
println("\(key) : \(dict0[key])");
}
}}}
###NSMutableDictionary
@Objective-c
{{{
NSMutableDictionary *dict1 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"value0", @"key0", @"value1", @"key1", nil];
[dict1 setObject:@"mod_value0" forKey:@"key0"]; // 差し替え
[dict1 setObject:@"value2" forKey:@"key2"]; // 追加
[dict1 removeObjectForKey:@"key1"]; // 削除
for(NSString *key in [dict1 allKeys]){
NSLog(@"%@, %@", key, [dict1 objectForKey:key]);
}
}}}
@Swift
{{{
var dict1:Dictionary<String, String> = ["key0" : "value0", "key1" : "value1"];
dict1["key0"] = "mod_value0"; // 差し替え
dict1["key2"] = "value2"; // 追加
dict1.removeValueForKey("key1"); // 削除
for key in dict1.keys{
println("\(key) : \(dict1[key])");
}
}}}
オブジェクト指向型C言語
オブジェクト指向型プログラミング言語といえば、多くの人は C++ や Java、C# 言語を思い浮かべるでしょう。 言語系にややマニアックな日本人であれば、Smalltalk と答えるかもしれません。 Objective-C も、Smalltalk と同じか、それ以上にマニアックなオブジェクト指向型のプログラミング言語でしょう。 特に、AT互換機と Windows でシステムを構成している技術者は、この言語に触れる機会すらないかもしれません。
しかし、一方でオブジェクト指向言語といえば Objective-C だろうと考えている技術者も存在します。 おそらく、その人は Mac OS の技術者か、スティーブ・ジョブズのファンでしょう。 現代のコンピュータで最も Objective-C を実用しているのは Apple 社の Mac OS X なのです。
ソフトウェアの開発に Objective-C を実用しているのは、Mac OS X 専用の便利なフリーソフトウェアがインターネットで公開されない原因の一つかもしれません。 なぜ、このようなマイナーな言語を用いているのかというと、Mac OS X が NeXT 社の NEXTSTEP の開発言語として採用されていたという歴史的理由です。 Mac OS X の GUI は、NEXTSTEP の API を引き継いでいるため、開発言語も、主に Objective-C を用いているのです。
しかし、脅える必要はありません。 Objective-C は C 言語と完全に互換性のある言語なので、C 言語のソースコードをコンパイルすることができます。 そして、C 言語にオブジェクト指向を実現するためのいくつかの機能を追加しているのです。 幸いに Objective-C のオブジェクト指向は C++ 言語よりはシンプルな構造です。
また、様々な言語の解説文書を記述してきた筆者の経験では、最も学習手順の構成が難しい言語でした。 Objective-C 言語の基本部分の特定の機能を学習するためには、Objective-C 言語全体の構造を理解しなければならないという難しさがあるため、オブジェクト指向の初心者はこの言語の基本部分の本質を理解するのは困難でしょう。 できれば、C++ 言語の知識と本質的なオブジェクト指向の理解が必要です。
Objective-C と C++
Objective-C は C 言語の基本構造をベースにして、Smalltalk 言語を取り入れた言語であり、C++ 言語とは歴史的にも言語仕様もまったく異なる存在です。 現代の主要なオブジェクト指向言語はそのほとんどが Java 言語をベースにしたものが多く、Smalltalk を基本としている Objective-C のコードを見ると、目を丸くすることでしょう。
さらに、C++ などの他の言語はクラスの実体のメモリ構造などを隠蔽するのに対し、Objective-C は C 言語を基本にクラスを実現しているため、ある程度の仕組みが C 言語から見れてしまいます。 つまり、言語仕様として新たにオブジェクト指向的性質を加えた現代のオブジェクト指向型言語に反し、Objective-C は C 言語にデザインパターンとしてオブジェクト指向のシステムを追加したという立場と考えることができます。
Java や C++ では、クラス型の概念やオブジェクトの生成方法を言語仕様として定めています。 しかし、Objective-C ではクラス型や生成方法すらヘッダファイルで定義されているため、その実体は C 言語の構造体を typedef 文で隠蔽しているだけです。 C 言語に親和性が高いのは良いのですが、他のオブジェクト指向言語を習得している技術者には、受け入れがたいものがあるかもしれません。 逆に、C 言語プログラミングにオブジェクト指向をデザインパターンとして採用することを好む開発者にとっては、追加された言語仕様と基盤の仕組みがサポートしてくれるので、都合が良いかもしれません。
Objective-C の実装
Mac OS X を利用しているのであれば、付属している開発環境をインストールするだけで Objective-C を使うことができるようになります。 しかし、Objective-C は Mac OS のためだけの言語ではありません。 すばらしいことに GCC コンパイラでもコンパイルすることができるので、Linux でもこの言語を利用することができます。 Windows でも、Windows 専用にコンパイルされた GCC コンパイラをインストールすることで使うことができます。
オブジェクト指向型プログラミング言語といえば、多くの人は C++ や Java、C# 言語を思い浮かべるでしょう。 言語系にややマニアックな日本人であれば、Smalltalk と答えるかもしれません。 Objective-C も、Smalltalk と同じか、それ以上にマニアックなオブジェクト指向型のプログラミング言語でしょう。 特に、AT互換機と Windows でシステムを構成している技術者は、この言語に触れる機会すらないかもしれません。
しかし、一方でオブジェクト指向言語といえば Objective-C だろうと考えている技術者も存在します。 おそらく、その人は Mac OS の技術者か、スティーブ・ジョブズのファンでしょう。 現代のコンピュータで最も Objective-C を実用しているのは Apple 社の Mac OS X なのです。
ソフトウェアの開発に Objective-C を実用しているのは、Mac OS X 専用の便利なフリーソフトウェアがインターネットで公開されない原因の一つかもしれません。 なぜ、このようなマイナーな言語を用いているのかというと、Mac OS X が NeXT 社の NEXTSTEP の開発言語として採用されていたという歴史的理由です。 Mac OS X の GUI は、NEXTSTEP の API を引き継いでいるため、開発言語も、主に Objective-C を用いているのです。
しかし、脅える必要はありません。 Objective-C は C 言語と完全に互換性のある言語なので、C 言語のソースコードをコンパイルすることができます。 そして、C 言語にオブジェクト指向を実現するためのいくつかの機能を追加しているのです。 幸いに Objective-C のオブジェクト指向は C++ 言語よりはシンプルな構造です。
また、様々な言語の解説文書を記述してきた筆者の経験では、最も学習手順の構成が難しい言語でした。 Objective-C 言語の基本部分の特定の機能を学習するためには、Objective-C 言語全体の構造を理解しなければならないという難しさがあるため、オブジェクト指向の初心者はこの言語の基本部分の本質を理解するのは困難でしょう。 できれば、C++ 言語の知識と本質的なオブジェクト指向の理解が必要です。
Objective-C と C++
Objective-C は C 言語の基本構造をベースにして、Smalltalk 言語を取り入れた言語であり、C++ 言語とは歴史的にも言語仕様もまったく異なる存在です。 現代の主要なオブジェクト指向言語はそのほとんどが Java 言語をベースにしたものが多く、Smalltalk を基本としている Objective-C のコードを見ると、目を丸くすることでしょう。
さらに、C++ などの他の言語はクラスの実体のメモリ構造などを隠蔽するのに対し、Objective-C は C 言語を基本にクラスを実現しているため、ある程度の仕組みが C 言語から見れてしまいます。 つまり、言語仕様として新たにオブジェクト指向的性質を加えた現代のオブジェクト指向型言語に反し、Objective-C は C 言語にデザインパターンとしてオブジェクト指向のシステムを追加したという立場と考えることができます。
Java や C++ では、クラス型の概念やオブジェクトの生成方法を言語仕様として定めています。 しかし、Objective-C ではクラス型や生成方法すらヘッダファイルで定義されているため、その実体は C 言語の構造体を typedef 文で隠蔽しているだけです。 C 言語に親和性が高いのは良いのですが、他のオブジェクト指向言語を習得している技術者には、受け入れがたいものがあるかもしれません。 逆に、C 言語プログラミングにオブジェクト指向をデザインパターンとして採用することを好む開発者にとっては、追加された言語仕様と基盤の仕組みがサポートしてくれるので、都合が良いかもしれません。
Objective-C の実装
Mac OS X を利用しているのであれば、付属している開発環境をインストールするだけで Objective-C を使うことができるようになります。 しかし、Objective-C は Mac OS のためだけの言語ではありません。 すばらしいことに GCC コンパイラでもコンパイルすることができるので、Linux でもこの言語を利用することができます。 Windows でも、Windows 専用にコンパイルされた GCC コンパイラをインストールすることで使うことができます。