보기를 만들고 그라디언트를 적용하는이 코드가 있습니다.
import UIKit
import QuartzCore
let rect : CGRect = CGRectMake(0,0,320,100)
var vista : UIView = UIView(frame: rect)
let gradient : CAGradientLayer = CAGradientLayer()
gradient.frame = vista.bounds
let cor1 = UIColor.blackColor()
let cor2 = UIColor.whiteColor()
let arrayColors = [cor1.CGColor, cor2.CGColor]
gradient.colors = arrayColors
view.layer.insertSublayer(gradient, atIndex:0)
Xcode에서 컴파일 오류가 발생하지 않지만 코드가 줄에서 충돌합니다.
let arrayColors = [cor1.CGColor, cor2.CGColor]
메시지 배열 요소를 사용하여 Objective-C에 연결할 수 없습니다.
실제로 Swift에서 CGColors 배열을 어떻게 만들 수 있는지 잘 모르겠 기 때문에 충돌이 발생할 것으로 예상했습니다. 여기서 놀라운 점은 Objective-C를 언급하는 Xcode입니다. 내 마음에 나는 신속하게 CGColorRef를 만들고있었습니다 ...
단서가 있습니까? Objective-C를 언급하는 이유는 무엇이며 어떻게 해결합니까?
Objective-C가 언급 된 이유는 UIKit과 QuartzCore가 Objective-C 프레임 워크이기 때문입니다. 특히 gradient.colors = arrayColors
.NET Framework를 예상하는 Objective-C 메서드를 호출하고 있습니다 NSArray
.
Apple의 문서 NSArray
에 따르면 배열의 항목을 고려할 수있는 한 배열이 자동으로 연결되어야하는 것처럼 들리기 때문에 버그처럼 보입니다 AnyObject
.
Swift 배열에서 NSArray 객체로 브리지 할 때 Swift 배열의 요소는 AnyObject와 호환되어야합니다. 예를 들어, Int [] 유형의 Swift 배열은 Int 구조 요소를 포함합니다. Int 유형은 클래스의 인스턴스가 아니지만 Int 유형이 NSNumber 클래스에 연결되기 때문에 Int 유형은 AnyObject와 호환됩니다. 따라서 Int [] 유형의 Swift 배열을 NSArray 객체에 연결할 수 있습니다. Swift 배열의 요소가 AnyObject와 호환되지 않는 경우 NSArray 객체에 브리지 할 때 런타임 오류가 발생합니다.
위에서 설명한 것과 동일한 브리징 규칙에 따라 Swift 배열 리터럴에서 직접 NSArray 객체를 만들 수도 있습니다. 상수 또는 변수를 NSArray 개체로 명시 적으로 입력하고 배열 리터럴에 할당하면 Swift는 Swift 배열 대신 NSArray 개체를 만듭니다.
현재로서는 해결 방법 arrayColors
은 NSArray
다음 과 같이 선언 하는 것입니다 .
let arrayColors: NSArray = [cor1.CGColor, cor2.CGColor]
또는 복용으로 선언하려면 다음을 수행하십시오 AnyObject
.
let arrayColors: Array <AnyObject> = [cor1.CGColor, cor2.CGColor]
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다