2014-06-10 15 views
7

Tìm cách sử dụng các tiện ích mở rộng Swift trong một tệp riêng biệt hoặc một giải pháp thay thế. Tạo tiện ích mở rộng chỉ hoạt động miễn là tiện ích mở rộng được viết trong cùng một tệp mà tiện ích đang được sử dụng.Sử dụng các tiện ích mở rộng trong tệp .swift riêng biệt

Đây là ví dụ về ViewController.swift hoạt động.

import UIKit 
var TestHelper: String = "Start Value" 
extension UIView { 
var testValue:String{ 
set{ 
    TestHelper = newValue 
} 
get{ 
    return TestHelper 
} 
} 
} 

class ViewController: UIViewController { 
override func viewDidLoad() { 
    super.viewDidLoad() 
    self.view.testValue = "Some Value" 
} 
override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
} 
} 

Lấy mở rộng ra của tập tin này và đặt trong một kết quả tập tin mới trong một tai nạn đưa ra lỗi này:

Program ended with exit code: 9 

Lỗi này được nói rằng nó không tồn tại Tôi nghĩ. Tạo tiện ích mở rộng trong từng tệp riêng biệt mà tiện ích mở rộng là cần thiết, rõ ràng là tạo ra các vấn đề với việc redeclaration không hợp lệ.

Cảm ơn trước!

+1

Khi tôi thử trình biên dịch này bị lỗi. Bạn có thể muốn [nộp lỗi] (http://bugreport.apple.com). – jtbandes

+0

Tôi cảm thấy rất không chắc chắn về tài sản bên trong phần mở rộng. Không có tình huống như trong http://stackoverflow.com/a/24115223/1726069? –

Trả lời

2

Nếu bạn di chuyển tiện ích sang tệp khác thì bạn cũng phải di chuyển TestHelper. Hoặc đơn giản hơn: đặt TestHelper vào tiện ích mở rộng

+0

Tôi cần phải làm rõ tôi đã đặt trình trợ giúp mở rộng trong tệp mở rộng. Có vẻ không quan trọng. Nếu tôi không nhầm testHelper đặt trong phần mở rộng sẽ cần sử dụng getter/setter và gây ra cùng một vấn đề nó giải quyết bằng cách đặt nó bên ngoài? – user3724387

1

Tôi đã cố gắng giải quyết vấn đề sẽ dễ dàng, nhưng có vẻ phức tạp hơn tôi nghĩ ban đầu.

Tôi đã kết thúc phải phân lớp UIView. Tôi không thể tạo một phần mở rộng cho UIView mà thêm một var. Tôi nghĩ rằng có lẽ họ đang buộc chúng tôi để phân lớp UIView, vì làm thế nào init hoặc get/set làm việc cho lớp. Tôi vừa làm cái này. Đó là không giống nhau nhưng nó có chức năng tương đương

import UIKit 

class MyView: UIView { 
    var testValue: String? 
    init(frame: CGRect) { 
     super.init(frame: frame) 
     self.backgroundColor = UIColor.greenColor() 
     self.bringSubviewToFront(self.superview) 
    } 
} 

và sau đó sử dụng nó như thế

override func viewDidLoad() { 
    super.viewDidLoad() 

    let myRect = self.myContent.frame 
    let myNewView: MyView = MyView(frame: myRect) 
    myNewView.testValue = "has been set" 
    self.myView.addSubview(myNewView) 

    NSLog("%@", myNewView.testValue!) 

} 

tôi có thể mở rộng Array với một var

extension Array { 
    var last: T? { 
    if self.isEmpty { 
     NSLog("array crash error - please fix") 
     return self [0] 
    } 
    else { 
     return self[self.endIndex - 1] 
     } 
    } 
} 

Nó rất dễ dàng để tạo ra một phần mở rộng cho UIKit nếu bạn chỉ thêm chức năng chứ không phải biến số

extension UIView { 
    func layerborders() { 
     let layer = self.layer 
     let frame = self.frame 
     let myColor = self.backgroundColor 
     layer.borderColor = UIColor.whiteColor().CGColor 
     layer.borderWidth = 0.8 
     layer.cornerRadius = frame.width/MyConstants.CornerRadius.toRaw() 
    } 
} 
+1

Cảm ơn bạn đã dành thời gian để kiểm tra sự cố này. Tôi thích các giải pháp tuy nhiên nó có thể sẽ không được một cái gì đó tôi sử dụng như một giải pháp đáng buồn. Tôi cảm thấy như tho sử dụng điều này để phong cách một thanh tab hoặc thanh điều hướng sẽ dẫn đến các vấn đề phân tầng và các nút che phủ vv. – user3724387

1

Tôi cũng gặp phải lỗi tương tự và cố gắng giải quyết nó tôi thấy rằng việc thêm tĩnh ở phía trước của khai báo biến mở rộng dường như làm các trick:

import UIKit 

static var TestHelper: String = "Start Value" 

extension UIView { 

    static var testValue: String { 
     set { 
      TestHelper = newValue 
     } 
     get{ 
      return TestHelper 
     } 
    } 

} 

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.view.testValue = "Some Value" 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 

} 

Hy vọng nó sẽ giúp!

Các vấn đề liên quan