我刚刚升级到Xcode 6.3,他们为Playgrounds提供了一些新功能.如果您创建一个新的游乐场并打开项目导航器,您将看到一个Sources文件夹,里面有一个"SupportCode.swift"文件.它在该文件的顶部读取
此文件(以及此操场的Sources目录中的所有其他Swift源文件)将预编译到一个框架中,该框架可自动提供给.playground.
我尝试将功能放到那里,我的操场无法使用.我究竟做错了什么?我是否必须手动手动编译SupportCode.swift文件?怎么样?
在C中你可以让你的枚举有这个
typedef enum _Bar {
A = 0,
B = 0,
C = 1
} Bar;
Run Code Online (Sandbox Code Playgroud)
在swift中,我想做同等的事情.但是编译器抱怨它不是唯一的.我如何告诉它我希望两个案例具有相同的价值?
enum Bar : Int {
case A = 0
case B = 0 //Does not work
case C = 1
}
Run Code Online (Sandbox Code Playgroud)
我试过了
case A | B = 0
Run Code Online (Sandbox Code Playgroud)
和
case A, B = 0
Run Code Online (Sandbox Code Playgroud)
但它似乎不像我想要的那样工作.我感谢任何帮助.
我的UItableView有一个奇怪的情况.
我正在从互联网上加载图像并以异步方式在uitableviewcell中呈现它们.当我向下滚动(即第1行到第6行)时,滚动按照我的预期顺利向下滚动.
然而,然后我向上滚动(ig行6到1)滚动向后跳.例如,如果我从第6行滚动到第5行,它将跳回到第6行.第二次我尝试向上滚动它让我上升到第4行,但然后它将我滚动回第5行或第6行但通常只有5.
我不明白为什么这只发生在一个方向.
它似乎影响ios 8但不影响ios 7.
因此,ios8和7如何处理uitableview是一个实现差异.
我怎样才能解决这个问题?
这里有一些代码可以为您提供一些上下文
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
CVFullImageTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
CVComicRecord *comicRecord = self.comicRecords[indexPath.row];
[cell.loaderGear stopAnimating];
[cell.text setText:comicRecord.title];
NSString *UUID = comicRecord.fullImagePageURL.absoluteString;
[cell setUUID:UUID];
//Check if image is in the cache
UIImage *fullImage = [self.contentViewCache objectForKey:UUID];
[cell setComicFullImage:fullImage];
if (fullImage) {
return cell;
}
[cell.loaderGear startAnimating];
[self requestImageForIndexPath:indexPath];
return cell;
}
- (void)requestImageForIndexPath:(NSIndexPath *)indexPath {
CVComicRecord *comicRecord = self.comicRecords[indexPath.row];
NSString *UUID = comicRecord.fullImagePageURL.absoluteString;
if ([self.contentViewCache objectForKey:UUID]) { …Run Code Online (Sandbox Code Playgroud) 当我尝试覆盖属性时,我收到错误"无法覆盖具有只读属性的可变属性"
我已经在超类中提供了get和set.
class Card {
var contents:String {
get {
return self.contents
}
set {
self.contents = newValue
}
}
init() {
self.contents = ""
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的Subclass,我试图覆盖"contents"属性.
class PlayingCard: Card {
override var contents:String { //<-- this is where I get the build error
get {
var rankStrings:Array<String> = PlayingCard.rankStrings()
return rankStrings[Int(self.rank)] + self.suit
}
}
}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
我想创建一个动态框架并分发它.它需要在模拟器,iPhone设备上运行时工作,并能够提交到App Store.
我知道lipo感谢本指南.它展示了我们如何将模拟器架构与iphone架构结合到一个动态框架中,该框架可以在不分发源代码的情况下进行分发.它允许我使用模拟器和iPhone设备的框架.但是,当我尝试将其发送到App Store时由于模拟器构建而失败.
Carthage提供了一个有趣的解决方案 它创建了一个适用于模拟器和iPhone的框架.但是当它是时候将它发送到App Store时,我们需要运行一个脚本来撕掉模拟器切片.
但是,DFP广告管理系统(DFP)的创建者已经找到了一种方法来创建适用于模拟器和设备的框架; 通过App Store提交; 并且不需要任何脚本来撕掉模拟器切片(AFAIK).我真正需要做的就是将GoogleMobileAds.framework文件拖入Linked Frameworks and Libraries.我不需要Embedded Binaries像大多数动态框架那样添加它,这有点令人惊讶)
我创建了一个使用DFP的示例项目来演示这一点.
// clone repository
git clone --recursive https://github.com/wh1pch81n/DoubleClickGoogleExample.git
// Move to correct branch
git submodule foreach 'git checkout master'
git submodule foreach 'git pull origin master'
Run Code Online (Sandbox Code Playgroud)
现在您可以选择Simulation_mate方案并运行应用程序.该应用将在底部显示一个广告横幅,以显示广告实际正在运行.
依赖图看起来像这样.
Simulation_mate.app
-> Mate.framework
-> DFP.framework
-> GoogleMobileAds.framework
Run Code Online (Sandbox Code Playgroud)
同样,我可以在模拟器,iPhone上运行Simulation_mate,并可以将其提交到App Store.
我的问题是,他们是如何创建这样的GoogleMobileAds.framework的?创建这样的框架需要遵循哪些步骤?
我知道要从资产目录中获取图像,我可以使用UIImage(名为:"fileName")来完成它.
但是,如果我从XCAsset目录中获取数据怎么办?我无法弄清楚这一点.
我试过了,
let url = NSBundle.mainBundle().URLForResource("fileName", withExtension: nil)
let data = NSData(contentsOfURL: url!)
Run Code Online (Sandbox Code Playgroud)
但它没有.我不知道如何从XCAssets目录中获取数据.如果有人可以帮助我(谷歌搜索没有帮助),请让我知道我会非常感激!
更新:
为什么我要从资产目录中获取数据?我将动画gif拖入资产目录.资产目录将其解释为DATA.这就是我试图从资产目录中获取数据的原因.
更新:这是我的Assets.xcassets文件夹的屏幕截图.
我正在使用命令行创建swift文件并使用"swift"命令来运行其中一个.但是,我希望一个文件能够从另一个文件访问函数.如果这是C,那么我可以使用#include宏并指定文件的位置.但斯威夫特的进口声明似乎并不允许这样.应该有办法,我想知道如何做到这一点.
例如:
如果我有一个包含函数的文件,然后我创建另一个使用该函数的文件.我如何允许它使用它?
// file1.swift
import Foundation
func sayHello() -> String {
return "hello"
}
// file2.swift
import file1 // <-- trying to import file1 but it doesn't work
println(sayHello())
Run Code Online (Sandbox Code Playgroud)
一旦文件生成,我在终端写"swift file2.swift".但它告诉我..
error: no such module 'file1.swift'
Run Code Online (Sandbox Code Playgroud)
很明显,swift编译器正在寻找一个模块.如何将file1变为模块?我已经看到了一些解决方案,但它们都发生在Xcode中.我正在寻找的是在命令行中完成所有操作.
我有一个单元测试来测试我的目标应用程序.我的目标应用程序依赖于动态框架.
当代码覆盖率结果返回时,它会列出我的目标应用程序的代码覆盖率以及动态框架
我不想让动态框架给出代码覆盖.有可能排除它吗?
Objective-c 有一个指向指针的指针的概念。如果取消引用第一个指针,则可以访问原始指针
void makeFive(int *n) {
*n = 5;
}
int n = 0;
makeFive(&n);
// n is now 5
Run Code Online (Sandbox Code Playgroud)
当它被桥接到 Swift 3 时,它变成了一个 UnsafeMutablePointer
func makeFive(_ n: UnsafeMutablePointer<Int>) {
n.memory = 5
}
var n: Int = 0
makeFive(&n)
// n is now 5
Run Code Online (Sandbox Code Playgroud)
但是,从 Swift 4 开始,这种行为发生了变化,并且 memory 属性不再可用。
与 makeFive(_:) 函数等效的 swift 4 是什么?
更新 感谢 Hamish,我现在知道“记忆”已重命名为指针。
// Assume you have two functions.
// Swift considers these functions as distinct
func cars(left look: String) {}
func cars(right look: String) {}
// How can I store them in a variable for later use?
let c: (left : String) -> () = cars
let c2: (right : String) -> () = cars
Run Code Online (Sandbox Code Playgroud)
当我尝试将这些方法存储到变量中时,收到一条错误消息,指出“汽车”不明确。我可以做什么来区分它们?
swift ×8
ios ×4
xcode ×3
ios8 ×2
objective-c ×2
closures ×1
command-line ×1
enums ×1
frameworks ×1
ios7 ×1
module ×1
overriding ×1
polymorphism ×1
properties ×1
swift3 ×1
swift4 ×1
uitableview ×1
unit-testing ×1
xcasset ×1
xcode6.3 ×1