2015-01-14 3 views
1

Я пытаюсь переписать образец кода Objective-C в Swift. Код в основном рисует график, используя CorePlot, который написан в Objective-C (образец от here). Вот часть исходного кода Objective-C:Невозможно вызвать метод Objective-C в Swift

CPTMutablePlotRange *xRange = [plotSpace.xRange mutableCopy]; 
[xRange expandRangeByFactor:CPTDecimalFromCGFloat(1.1f)]; 

Я переписать так:

var xRange = plotSpace.plotRangeForCoordinate(CPTCoordinate.X).mutableCopy() as CPTMutablePlotRange; 
xRange.expandRangeByFactor(NSDecimalNumber(1.1)) 

На данный момент у меня есть ошибки компиляции, говоря, что «CPTMutablePlotRage does not have a member named 'expandRangeByFactor'». Кто-нибудь знает, что я сделал что-то не так? Я проверил и в Objective-C код, CTMutablePotRange определенно имеет метод под названием expandRangeByFactor. Спасибо.

+0

Обратите внимание, что Swift 1.2 может работать с NSDecimal. – matt

+0

Спасибо за обновление! – trungdinhtrong

ответ

0

expandRangeByFactor есть, но требуется NSDecimal. Вы пытаетесь предоставить NSDecimalNumber, что не то же самое. (Еще одна проблема с вашим кодом - нерелевантная в этой ситуации, но все еще проблема - это то, что вы не можете сказать NSDecimalNumber(1.1). Нет такого инициализатора.)

Здесь вам необходимо передать параметр NSDecimal. Вот почему исходный код Objective-C вызывает функцию Core Plot CPTDecimalFromCGFloat() - для генерации NSDecimal, который идет здесь.

Однако вы не можете сделать это в Swift, потому что он не знает о NSDecimal. Таким образом, Swift не может видеть этот метод независимо от того, что вы делаете, потому что он не может видеть метод, который принимает значение типа, с которым он не может справиться.

Люди с сердечником знают об этой проблеме: см. https://github.com/core-plot/core-plot/issues/96 В ветке release-2.0 содержится исправление. Как видите, here, в новом API вы можете просто передать NSNumber до expandRangeByFactor.

Обновление: Swift 1.2 (доступно в Xcode 6.3 и новее) может работать с NSDecimal.

+0

Спасибо за ответ. Я читал откуда-то, что NSDecimal не поддерживается в Swift. Похоже, я зашел в тупик. Хотелось бы, однако, что быстро сказать мне, что этот метод не принимает этот параметр или что-то в этом роде. Может быть, этот метод не был даже мостом для быстрого из-за NSDecimal. Для инициализации NSDecimalNumber, вероятно, вы правы, но я еще не ударил с ошибкой, потому что компилятор, вероятно, остановился, прежде чем он ударил это sot – trungdinhtrong

+0

Согласно [этой дискуссии] (https://github.com/core-plot/core-plot/issues/96) вы можете найти пересмотренный API Core Plot, который не использует NSDecimal в релизе 2.0 в Core Plot на github. – matt

+0

Вы можете передать NSNumber, если используете версию Core Plot версии 2.0. – matt

Смежные вопросы