LoginSignup
30
31

More than 5 years have passed since last update.

SwiftでXcode6 Beta7にアップデートして対応したことまとめ

Last updated at Posted at 2014-09-04

apple_swift.jpg

はじめに

9月3日にXcode6 Beta7がリリースされました。今回はリリースノートを見るとをSwiftの変更数は少なく安堵していたのですが、いざ開発中のプロジェクトをコンパイルしてみると怒涛のコンパイルエラー(数百個)が発生! ちまちまとエラーの対応を行い、半日ほどかけてようやくBeta7で動くようになりました。

以下、自分の手元で確認できた変更点です。
【注意】Beta7の変更点をすべて網羅しているわけではありません。

Optionalに変更されたところ

対象の定義がoptionalに変更されたケースです。利用時にForced Unwrapping, Optional Chaining, Optional Bindingをするように変更します。

UIViewController

storyboardnavigationControllerは毎回nilチェックするのはめんどくさいですね。

class UIViewController : UIResponder, NSCoding, UIAppearanceContainer, NSObjectProtocol, UITraitEnvironment, UIContentContainer {
    ...
    var nibName: String? { get } 
    var nibBundle: NSBundle? { get } 
    var storyboard: UIStoryboard? { get }
}

extension UIViewController {    
    ...
    var navigationController: UINavigationController? { get } 
}

extension UIViewController {
    ...
    var toolbarItems: [AnyObject]?
}

UITableViewCell

textLabel, detailTextLabel, imageView, backgroundViewはデフォルトがnilになりました。
扱いにくいですね。。。

class UITableViewCell : UIView, NSCoding, UIGestureRecognizerDelegate, NSObjectProtocol {
    ...    
    var imageView: UIImageView? { get } // default is nil.  image view will be created if necessary.
    var textLabel: UILabel? { get } // default is nil.  label will be created if necessary.
    var detailTextLabel: UILabel? { get } // default is nil.  label will be created if necessary (and the current style supports a detail label).
    ...
    var backgroundView: UIView? 

UIView

extension UIView {    
    var superview: UIView? { get }
    var window: UIWindow? { get }

UIButotn

class UIButton : UIControl, NSCoding {
    ...
    var tintColor: UIColor?
    var titleLabel: UILabel? { get }
    var imageView: UIImageView? { get }

UIGestureRecognizer

class UIGestureRecognizer : NSObject {
    var view: UIView? { get } 

NSURL

class NSURL : NSObject, NSSecureCoding, NSCoding, NSCopying {    
    ...
    var host: String? { get }
    @NSCopying var port: NSNumber? { get }
    var user: String? { get }
    var password: String? { get }
    var path: String? { get }
    var fragment: String? { get }
    var parameterString: String? { get }
    var query: String? { get }
    var relativePath: String? { get }

UIViewControllerContextTransitioning

protocol UIViewControllerContextTransitioning : NSObjectProtocol {
    func viewControllerForKey(key: String!) -> UIViewController?

Outlet

@IBOutlet weak var tableView: UITableView

↓

@IBOutlet weak var tableView: UITableView!
or 
@IBOutlet weak var tableView: UITableView?

Optionalではなくなったところ

segue.identifierはOptionalではなくなった

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if let identifier = segue.identifier {
        if identifier == "Hogeidentifier" {
        }
    }
}

↓

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "HogeIdentifier" {
    }
}

Forced Unwrapping ではなくなったところ

UITableViewDataSource/Delegate, UICollectionViewDataSource/Delegate, UIScrollViewDelegate

Delegateの移譲先のメソッドのパラメータの定義が軒並み変更になりました。ここはえいやと置換で対応。

tableView: UITableView!

↓

tableView: UITableView
collectionView: UICollectionView!

↓

collectionView: UICollectionView
scrollView: UIScrollView!

↓

scrollView: UIScrollView
indexPath: NSIndexPath!

↓

indexPath: NSIndexPath
-> UITableViewCell!

↓

-> UITableViewCell
-> UICollectionViewCell!

↓

-> UICollectionViewCell

NSCoping

func copyWithZone(zone: NSZone) -> AnyObject!

↓

func copyWithZone(zone: NSZone) -> AnyObject

UIPanGestureRecognizer

override init(target: AnyObject!, action: Selector) 

↓

override init(target: AnyObject, action: Selector) 

UIViewControllerContextTransitioning

transitionContext: UIViewControllerContextTransitioning!

↓

transitionContext: UIViewControllerContextTransitioning

prepareForSegue

prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!)

↓

prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)

なぜに。。。

UITableViewControllerUITableViewはUnwrapなのですが、UICollectionViewControllerUICollectionViewはOptionalです。同じ挙動になるべきだと思うのですが。。。

class UITableViewController : UIViewController, ... {
    var tableView: UITableView!    <<---
class UICollectionViewController : UIViewController, ... {
    var collectionView: UICollectionView?   <<---
30
31
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
31